|
|
<!DOCTYPE html> |
|
|
<html lang="zh-CN"> |
|
|
<head> |
|
|
<meta charset="UTF-8" /> |
|
|
<meta http-equiv="X-UA-Compatible" content="IE=edge" /> |
|
|
<meta name="viewport" content="width=device-width, initial-scale=1" /> |
|
|
|
|
|
|
|
|
<title>自制一个简单的微信聊天机器人 | Mayx的博客</title> |
|
|
<meta name="generator" content="Jekyll v3.9.5" /> |
|
|
<meta property="og:title" content="自制一个简单的微信聊天机器人" /> |
|
|
<meta name="author" content="mayx" /> |
|
|
<meta property="og:locale" content="zh_CN" /> |
|
|
<meta name="description" content="感觉API好像还挺有意思" /> |
|
|
<meta property="og:description" content="感觉API好像还挺有意思" /> |
|
|
<meta property="og:site_name" content="Mayx的博客" /> |
|
|
<meta property="og:type" content="article" /> |
|
|
<meta property="article:published_time" content="2021-02-06T00:00:00+08:00" /> |
|
|
<meta name="twitter:card" content="summary" /> |
|
|
<meta property="twitter:title" content="自制一个简单的微信聊天机器人" /> |
|
|
<meta name="google-site-verification" content="huTYdEesm8NaFymixMNqflyCp6Jfvd615j5Wq1i2PHc" /> |
|
|
<meta name="msvalidate.01" content="0ADFCE64B3557DC4DC5F2DC224C5FDDD" /> |
|
|
<meta name="yandex-verification" content="fc0e535abed800be" /> |
|
|
<script type="application/ld+json"> |
|
|
{"@context":"https://schema.org","@type":"BlogPosting","author":{"@type":"Person","name":"mayx"},"dateModified":"2021-02-06T00:00:00+08:00","datePublished":"2021-02-06T00:00:00+08:00","description":"感觉API好像还挺有意思","headline":"自制一个简单的微信聊天机器人","mainEntityOfPage":{"@type":"WebPage","@id":"/2021/02/06/wechatbot.html"},"publisher":{"@type":"Organization","logo":{"@type":"ImageObject","url":"https://avatars0.githubusercontent.com/u/17966333"},"name":"mayx"},"url":"/2021/02/06/wechatbot.html"}</script> |
|
|
|
|
|
|
|
|
<link rel="canonical" href="https://mabbs.github.io/2021/02/06/wechatbot.html" /> |
|
|
<link type="application/atom+xml" rel="alternate" href="/atom.xml" title="Mayx的博客" /> |
|
|
<link rel="alternate" type="application/rss+xml" title="Mayx的博客(RSS)" href="/rss.xml" /> |
|
|
<link rel="alternate" type="application/json" title="Mayx的博客(JSON Feed)" href="/feed.json" /> |
|
|
<link rel="stylesheet" href="/assets/css/style.css?v=1768642552" /> |
|
|
|
|
|
<link rel="stylesheet" href="/Live2dHistoire/live2d/css/live2d.css" /> |
|
|
|
|
|
<link rel="search" type="application/opensearchdescription+xml" href="/opensearch.xml" title="Mayx的博客" /> |
|
|
<link rel="webmention" href="https://webmention.io/mabbs.github.io/webmention" /> |
|
|
<link rel="pingback" href="https://webmention.io/mabbs.github.io/xmlrpc" /> |
|
|
<link rel="preconnect" href="https://summary.mayx.eu.org" crossorigin="anonymous" /> |
|
|
<link rel="prefetch" href="https://www.blogsclub.org/badge/mabbs.github.io" as="image" /> |
|
|
<link rel="blogroll" type="text/xml" href="/blogroll.opml" /> |
|
|
<link rel="me" href="https://github.com/Mabbs" /> |
|
|
<script src="/assets/js/jquery.min.js"></script> |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<script> |
|
|
var lastUpdated = new Date("Sat, 17 Jan 2026 17:35:52 +0800"); |
|
|
var BlogAPI = "https://summary.mayx.eu.org"; |
|
|
</script> |
|
|
<script src="/assets/js/main.js"></script> |
|
|
|
|
|
|
|
|
|
|
|
<script async="async" src="https://www.googletagmanager.com/gtag/js?id=UA-137710294-1"></script> |
|
|
<script> |
|
|
window.dataLayer = window.dataLayer || []; |
|
|
function gtag(){dataLayer.push(arguments);} |
|
|
gtag('js', new Date()); |
|
|
gtag('config', 'UA-137710294-1'); |
|
|
</script> |
|
|
|
|
|
<script src="/assets/js/instant.page.js" type="module"></script> |
|
|
|
|
|
</head> |
|
|
|
|
|
<body> |
|
|
<noscript><marquee style="top: -15px; position: relative;"><small>发现当前浏览器没有启用JavaScript,这不影响你的浏览,但可能会有一些功能无法使用……</small></marquee></noscript> |
|
|
|
|
|
<div class="wrapper"> |
|
|
<header class="h-card"> |
|
|
<h1><a class="u-url u-uid p-name" rel="me" href="/">Mayx的博客</a></h1> |
|
|
|
|
|
|
|
|
<img src="https://avatars0.githubusercontent.com/u/17966333" fetchpriority="high" class="u-photo" alt="Logo" style="width: 90%; max-width: 300px; max-height: 300px;" /> |
|
|
|
|
|
|
|
|
<p class="p-note">Mayx's Home Page</p> |
|
|
|
|
|
<form action="/search.html"> |
|
|
<input type="text" name="keyword" id="search-input-all" placeholder="Search blog posts.." /> <input type="submit" value="搜索" /> |
|
|
</form> |
|
|
<br /> |
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
|
<p class="view"><a class="u-url" href="/Mabbs/">About me</a></p> |
|
|
|
|
|
<ul class="downloads"> |
|
|
|
|
|
<li style="width: 270px; border-right: none;"><a href="/MayxBlog.tgz">Download <strong>TGZ File</strong></a></li> |
|
|
|
|
|
</ul> |
|
|
</header> |
|
|
<section class="h-entry"> |
|
|
|
|
|
<small><time class="date dt-published" datetime="2021-02-06T00:00:00+08:00">6 February 2021</time> - 字数统计:4038 - 阅读大约需要13分钟 - Hits: <span id="/2021/02/06/wechatbot.html" class="visitors">Loading...</span></small> |
|
|
<h1 class="p-name">自制一个简单的微信聊天机器人</h1> |
|
|
|
|
|
<p class="view">by <a class="p-author h-card" href="//github.com/Mabbs">mayx</a></p> |
|
|
<div id="outdate" style="display:none;"> |
|
|
<hr /><p> |
|
|
这是一篇创建于 <span id="outime"></span> 天前的文章,其中的信息可能已经有所发展或是发生改变。 |
|
|
</p> |
|
|
</div> |
|
|
<script> |
|
|
daysold = Math.floor((new Date().getTime() - new Date("Sat, 06 Feb 2021 00:00:00 +0800").getTime()) / (24 * 60 * 60 * 1000)); |
|
|
if (daysold > 90) { |
|
|
document.getElementById("outdate").style.display = "block"; |
|
|
document.getElementById("outime").innerHTML = daysold; |
|
|
} |
|
|
</script> |
|
|
|
|
|
<hr /> |
|
|
|
|
|
<b>AI摘要</b> |
|
|
<p id="ai-output">这篇文章讲述了作者自制一个微信聊天机器人的过程。起初被Server酱·TurboMini版激发了兴趣,决定利用微信公众号的API实现一个图片发送或聊天功能。作者遇到的主要问题是微信被动回复需在5秒内,这对在国外免费虚拟空间且网络连接较差的情况下的图片转发造成了阻碍。为解决这个问题,作者将聊天机器人功能作为备选,使用了图灵机器人API进行文字交互,并提到了可能的改进方案,如定时上传图片、设置多条命令分开负责上传和发送、或以图文形式每天发送等。</p> |
|
|
|
|
|
<hr /> |
|
|
|
|
|
|
|
|
|
|
|
<ul><li><a href="#起因">起因</a></li><li><a href="#代码">代码</a></li><li><a href="#使用方法">使用方法</a></li><li><a href="#暂时废弃的代码">暂时废弃的代码</a></li><li><a href="#替代的方案">替代的方案</a></li></ul> |
|
|
<hr /> |
|
|
|
|
|
|
|
|
<main class="post-content e-content" role="main"><p>感觉API好像还挺有意思</p> |
|
|
<h1 id="起因"> |
|
|
|
|
|
|
|
|
<a href="#起因"><svg class='octicon' viewBox='0 0 16 16' version='1.1' width='16' height='32' aria-hidden='true'><path fill-rule='evenodd' d='M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z'></path></svg></a> 起因 |
|
|
|
|
|
|
|
|
</h1> |
|
|
|
|
|
<p>前两天我<a href="/2021/02/02/serverchan.html">制作了Server酱·TurboMini版</a>之后感觉微信公众号的API好像还挺有意思的,总的来说也不是很复杂,没有用什么特别奇怪的东西,而且文档还算清晰,这一点还是很不错的。 </p><p> |
|
|
于是最近我就开始看微信开放文档,其实我刚写完Server酱·TurboMini版之后我就在想,好多人在QQ上搞那种只要说来点什么图,机器人就会发图片的一个功能。我感觉这个好像有点意思,因为我平时用微信更多一些,既然有测试号这样好的平台,那么我就应该搞点这样的功能。 </p><p> |
|
|
我花了一天的时间通读整个文档然后把程序写了出来,然而发生了很糟糕的事情,那就是微信被动回复的时间要求必须在5秒以内,否则就会报错,然而让服务器转发图片本来就很耗时,又加上我用的是垃圾国外免费的虚拟空间,中国与国际互联网的连接又很差劲,导致5秒内程序必定不可能来得及回复。 </p><p> |
|
|
没办法,我花了一天时间写的东西,我一定要水一篇文章!所以我想了想,干脆写成聊天机器人吧,那个东西也简单,像我博客上的伊斯特瓦尔就用了聊天机器人(有现成的API啥都好搞)。于是我稍微改动了一下代码,把发图机器人改成了聊天机器人。</p> |
|
|
<h1 id="代码"> |
|
|
|
|
|
|
|
|
<a href="#代码"><svg class='octicon' viewBox='0 0 16 16' version='1.1' width='16' height='32' aria-hidden='true'><path fill-rule='evenodd' d='M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z'></path></svg></a> 代码 |
|
|
|
|
|
|
|
|
</h1> |
|
|
|
|
|
<div class="language-php highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp"><?php</span> |
|
|
<span class="nv">$appid</span><span class="o">=</span><span class="n">微信appID</span><span class="p">;</span> |
|
|
<span class="nv">$secret</span><span class="o">=</span><span class="n">微信appsecret</span><span class="p">;</span> |
|
|
<span class="nv">$appkey</span><span class="o">=</span><span class="n">图灵机器人APIkey</span><span class="p">;</span> |
|
|
<span class="k">function</span> <span class="n">checkSignature</span><span class="p">()</span> |
|
|
<span class="p">{</span> |
|
|
<span class="nv">$signature</span> <span class="o">=</span> <span class="nv">$_GET</span><span class="p">[</span><span class="s2">"signature"</span><span class="p">];</span> |
|
|
<span class="nv">$timestamp</span> <span class="o">=</span> <span class="nv">$_GET</span><span class="p">[</span><span class="s2">"timestamp"</span><span class="p">];</span> |
|
|
<span class="nv">$nonce</span> <span class="o">=</span> <span class="nv">$_GET</span><span class="p">[</span><span class="s2">"nonce"</span><span class="p">];</span> |
|
|
|
|
|
<span class="nv">$token</span> <span class="o">=</span> <span class="s1">'mayx'</span><span class="p">;</span> |
|
|
<span class="nv">$tmpArr</span> <span class="o">=</span> <span class="k">array</span><span class="p">(</span><span class="nv">$token</span><span class="p">,</span> <span class="nv">$timestamp</span><span class="p">,</span> <span class="nv">$nonce</span><span class="p">);</span> |
|
|
<span class="nb">sort</span><span class="p">(</span><span class="nv">$tmpArr</span><span class="p">,</span> <span class="no">SORT_STRING</span><span class="p">);</span> |
|
|
<span class="nv">$tmpStr</span> <span class="o">=</span> <span class="nb">implode</span><span class="p">(</span> <span class="nv">$tmpArr</span> <span class="p">);</span> |
|
|
<span class="nv">$tmpStr</span> <span class="o">=</span> <span class="nb">sha1</span><span class="p">(</span> <span class="nv">$tmpStr</span> <span class="p">);</span> |
|
|
|
|
|
<span class="k">if</span><span class="p">(</span> <span class="nv">$tmpStr</span> <span class="o">==</span> <span class="nv">$signature</span> <span class="p">){</span> |
|
|
<span class="k">return</span> <span class="kc">true</span><span class="p">;</span> |
|
|
<span class="p">}</span><span class="k">else</span><span class="p">{</span> |
|
|
<span class="k">return</span> <span class="kc">false</span><span class="p">;</span> |
|
|
<span class="p">}</span> |
|
|
<span class="p">}</span> |
|
|
<span class="k">if</span><span class="p">(</span><span class="nf">checkSignature</span><span class="p">()){</span> |
|
|
<span class="k">if</span><span class="p">(</span><span class="nv">$_GET</span><span class="p">[</span><span class="s2">"echostr"</span><span class="p">]){</span> |
|
|
<span class="k">echo</span> <span class="nv">$_GET</span><span class="p">[</span><span class="s2">"echostr"</span><span class="p">];</span> |
|
|
<span class="p">}</span><span class="k">else</span><span class="p">{</span> |
|
|
<span class="nv">$content</span> <span class="o">=</span> <span class="nb">file_get_contents</span><span class="p">(</span><span class="s2">"php://input"</span><span class="p">);</span> |
|
|
<span class="nv">$p</span> <span class="o">=</span> <span class="nb">xml_parser_create</span><span class="p">();</span> |
|
|
<span class="nb">xml_parse_into_struct</span><span class="p">(</span><span class="nv">$p</span><span class="p">,</span> <span class="nv">$content</span><span class="p">,</span> <span class="nv">$vals</span><span class="p">,</span> <span class="nv">$index</span><span class="p">);</span> |
|
|
<span class="nb">xml_parser_free</span><span class="p">(</span><span class="nv">$p</span><span class="p">);</span> |
|
|
<span class="k">if</span><span class="p">(</span><span class="nv">$vals</span><span class="p">[</span><span class="nv">$index</span><span class="p">[</span><span class="s1">'MSGTYPE'</span><span class="p">][</span><span class="mi">0</span><span class="p">]][</span><span class="s1">'value'</span><span class="p">]</span> <span class="o">==</span> <span class="s1">'text'</span><span class="p">){</span> |
|
|
<span class="k">echo</span> <span class="s1">'<xml> |
|
|
<ToUserName><![CDATA['</span><span class="mf">.</span><span class="nv">$vals</span><span class="p">[</span><span class="nv">$index</span><span class="p">[</span><span class="s1">'FROMUSERNAME'</span><span class="p">][</span><span class="mi">0</span><span class="p">]][</span><span class="s1">'value'</span><span class="p">]</span><span class="mf">.</span><span class="s1">']]></ToUserName> |
|
|
<FromUserName><![CDATA['</span><span class="mf">.</span><span class="nv">$vals</span><span class="p">[</span><span class="nv">$index</span><span class="p">[</span><span class="s1">'TOUSERNAME'</span><span class="p">][</span><span class="mi">0</span><span class="p">]][</span><span class="s1">'value'</span><span class="p">]</span><span class="mf">.</span><span class="s1">']]></FromUserName> |
|
|
<CreateTime>'</span><span class="mf">.</span><span class="nb">time</span><span class="p">()</span><span class="mf">.</span><span class="s1">'</CreateTime> |
|
|
<MsgType><![CDATA[text]]></MsgType> |
|
|
<Content><![CDATA['</span><span class="mf">.</span><span class="nb">json_decode</span><span class="p">(</span><span class="nb">file_get_contents</span><span class="p">(</span><span class="s1">'https://www.tuling123.com/openapi/api'</span><span class="p">,</span> <span class="kc">false</span><span class="p">,</span> <span class="nb">stream_context_create</span><span class="p">(</span><span class="k">array</span><span class="p">(</span><span class="s1">'http'</span> <span class="o">=></span> <span class="k">array</span><span class="p">(</span><span class="s1">'method'</span> <span class="o">=></span> <span class="s1">'POST'</span><span class="p">,</span><span class="s1">'header'</span> <span class="o">=></span> <span class="s1">'Content-type:application/x-www-form-urlencoded'</span><span class="p">,</span><span class="s1">'content'</span> <span class="o">=></span> <span class="nb">http_build_query</span><span class="p">(</span><span class="k">array</span><span class="p">(</span><span class="s1">'key'</span> <span class="o">=></span> <span class="nv">$appkey</span><span class="p">,</span><span class="s1">'info'</span> <span class="o">=></span> <span class="nv">$vals</span><span class="p">[</span><span class="nv">$index</span><span class="p">[</span><span class="s1">'CONTENT'</span><span class="p">][</span><span class="mi">0</span><span class="p">]][</span><span class="s1">'value'</span><span class="p">],</span><span class="s1">'userid'</span> <span class="o">=></span> <span class="nv">$vals</span><span class="p">[</span><span class="nv">$index</span><span class="p">[</span><span class="s1">'FROMUSERNAME'</span><span class="p">][</span><span class="mi">0</span><span class="p">]][</span><span class="s1">'value'</span><span class="p">])))))),</span><span class="kc">true</span><span class="p">)[</span><span class="s1">'text'</span><span class="p">]</span><span class="mf">.</span><span class="s1">']]></Content> |
|
|
</xml>'</span><span class="p">;</span> |
|
|
<span class="p">}</span> |
|
|
<span class="p">}</span> |
|
|
<span class="p">}</span><span class="k">else</span><span class="p">{</span> |
|
|
<span class="k">echo</span> <span class="s1">'error'</span><span class="p">;</span> |
|
|
<span class="p">}</span> |
|
|
</code></pre></div></div> |
|
|
<h1 id="使用方法"> |
|
|
|
|
|
|
|
|
<a href="#使用方法"><svg class='octicon' viewBox='0 0 16 16' version='1.1' width='16' height='32' aria-hidden='true'><path fill-rule='evenodd' d='M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z'></path></svg></a> 使用方法 |
|
|
|
|
|
|
|
|
</h1> |
|
|
|
|
|
<p>和<a href="/2021/02/02/serverchan.html">上一篇文章</a>一样,同样需要去<a href="https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login">申请</a>一个测试号,不过有一点不一样,那就是这一次需要配置接口配置信息,URL就填这个程序能在互联网上访问的地址,而Token则是填mayx。为什么呢?因为我在代码里这样写的啊……如果想改可以把对应的变量改成自己喜欢的值,总之保证两边一样就行。 </p><p> |
|
|
提交之后接口就配置好了,不过还没有结束,为了能使用机器人,还得要去注册<a href="http://www.turingapi.com/">图灵机器人</a>,毕竟又不可能自己去写一个聊天机器人,那个需要的资源太多了。现在那个图灵机器人好像必须要实名才能用,那总之混互联网的人遇到这种问题应该也不是问题了吧。 </p><p> |
|
|
注册好机器人之后就直接把APIKey粘到代码里面,然后整个代码就可以正常运行了,现在你就可以和你的机器人聊天了。</p> |
|
|
<h1 id="暂时废弃的代码"> |
|
|
|
|
|
|
|
|
<a href="#暂时废弃的代码"><svg class='octicon' viewBox='0 0 16 16' version='1.1' width='16' height='32' aria-hidden='true'><path fill-rule='evenodd' d='M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z'></path></svg></a> 暂时废弃的代码 |
|
|
|
|
|
|
|
|
</h1> |
|
|
|
|
|
<div class="language-php highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="nb">define</span><span class="p">(</span><span class="s1">'MULTIPART_BOUNDARY'</span><span class="p">,</span> <span class="s1">'--------------------------'</span><span class="mf">.</span><span class="nb">microtime</span><span class="p">(</span><span class="kc">true</span><span class="p">));</span> |
|
|
|
|
|
<span class="nv">$file_contents</span> <span class="o">=</span> <span class="nb">file_get_contents</span><span class="p">(</span><span class="nb">json_decode</span><span class="p">(</span><span class="nb">file_get_contents</span><span class="p">(</span><span class="s1">'https://www.pixiv.net/ajax/illust/'</span><span class="mf">.</span><span class="nb">json_decode</span><span class="p">(</span><span class="nb">file_get_contents</span><span class="p">(</span><span class="s1">'https://api.loli.st/pixiv/'</span><span class="p">),</span><span class="kc">true</span><span class="p">)[</span><span class="s1">'illust_id'</span><span class="p">]</span><span class="mf">.</span><span class="s1">'/pages'</span><span class="p">),</span><span class="kc">true</span><span class="p">)[</span><span class="s1">'body'</span><span class="p">][</span><span class="mi">0</span><span class="p">][</span><span class="s1">'urls'</span><span class="p">][</span><span class="s1">'regular'</span><span class="p">],</span> <span class="kc">false</span><span class="p">,</span> <span class="nb">stream_context_create</span><span class="p">(</span><span class="k">array</span><span class="p">(</span><span class="s1">'http'</span> <span class="o">=></span> <span class="k">array</span><span class="p">(</span><span class="s1">'method'</span> <span class="o">=></span> <span class="s1">'GET'</span><span class="p">,</span><span class="s1">'header'</span> <span class="o">=></span> <span class="s2">"referer: https://www.pixiv.net/"</span><span class="p">))));</span> |
|
|
|
|
|
<span class="nv">$context</span> <span class="o">=</span> <span class="nb">stream_context_create</span><span class="p">(</span><span class="k">array</span><span class="p">(</span> |
|
|
<span class="s1">'http'</span> <span class="o">=></span> <span class="k">array</span><span class="p">(</span> |
|
|
<span class="s1">'method'</span> <span class="o">=></span> <span class="s1">'POST'</span><span class="p">,</span> |
|
|
<span class="s1">'header'</span> <span class="o">=></span> <span class="s1">'Content-Type: multipart/form-data; boundary='</span><span class="mf">.</span><span class="no">MULTIPART_BOUNDARY</span><span class="p">,</span> |
|
|
<span class="s1">'content'</span> <span class="o">=></span> <span class="s2">"--"</span><span class="mf">.</span><span class="no">MULTIPART_BOUNDARY</span><span class="mf">.</span><span class="s2">"</span><span class="se">\r\n</span><span class="s2">"</span><span class="mf">.</span> |
|
|
<span class="s2">"Content-Disposition: filename=</span><span class="se">\"</span><span class="s2">image.png</span><span class="se">\"\r\n</span><span class="s2">"</span><span class="mf">.</span> |
|
|
<span class="s2">"Content-Type: image/png</span><span class="se">\r\n\r\n</span><span class="s2">"</span><span class="mf">.</span> |
|
|
<span class="nv">$file_contents</span><span class="mf">.</span><span class="s2">"</span><span class="se">\r\n</span><span class="s2">"</span><span class="mf">.</span> |
|
|
<span class="s2">"--"</span><span class="mf">.</span><span class="no">MULTIPART_BOUNDARY</span><span class="mf">.</span><span class="s2">"--</span><span class="se">\r\n</span><span class="s2">"</span> |
|
|
<span class="p">)</span> |
|
|
<span class="p">));</span> |
|
|
|
|
|
<span class="k">echo</span> <span class="s1">'<xml> |
|
|
<ToUserName><![CDATA['</span><span class="mf">.</span><span class="nv">$vals</span><span class="p">[</span><span class="nv">$index</span><span class="p">[</span><span class="s1">'FROMUSERNAME'</span><span class="p">][</span><span class="mi">0</span><span class="p">]][</span><span class="s1">'value'</span><span class="p">]</span><span class="mf">.</span><span class="s1">']]></ToUserName> |
|
|
<FromUserName><![CDATA['</span><span class="mf">.</span><span class="nv">$vals</span><span class="p">[</span><span class="nv">$index</span><span class="p">[</span><span class="s1">'TOUSERNAME'</span><span class="p">][</span><span class="mi">0</span><span class="p">]][</span><span class="s1">'value'</span><span class="p">]</span><span class="mf">.</span><span class="s1">']]></FromUserName> |
|
|
<CreateTime>'</span><span class="mf">.</span><span class="nb">time</span><span class="p">()</span><span class="mf">.</span><span class="s1">'</CreateTime> |
|
|
<MsgType><![CDATA[image]]></MsgType> |
|
|
<Image> |
|
|
<MediaId><![CDATA['</span><span class="mf">.</span><span class="nb">json_decode</span><span class="p">(</span><span class="nb">file_get_contents</span><span class="p">(</span><span class="s1">'https://api.weixin.qq.com/cgi-bin/media/upload?access_token='</span><span class="mf">.</span><span class="nb">json_decode</span><span class="p">(</span><span class="nb">file_get_contents</span><span class="p">(</span><span class="s1">'https://api.weixin.qq.com/cgi-bin/token?grant_type=client_credential&appid='</span><span class="mf">.</span><span class="nv">$appid</span><span class="mf">.</span><span class="s1">'&secret='</span><span class="mf">.</span><span class="nv">$secret</span><span class="p">),</span><span class="kc">true</span><span class="p">)[</span><span class="n">access_token</span><span class="p">]</span><span class="mf">.</span><span class="s1">'&type=image'</span><span class="p">,</span> <span class="kc">false</span><span class="p">,</span> <span class="nv">$context</span><span class="p">),</span><span class="kc">true</span><span class="p">)[</span><span class="s1">'media_id'</span><span class="p">]</span><span class="mf">.</span><span class="s1">']]></MediaId> |
|
|
</Image> |
|
|
</xml>'</span><span class="p">;</span> |
|
|
</code></pre></div></div> |
|
|
<p>其实这段代码不是不能工作,只是它不能符合要求,没办法及时的把图片上传到微信服务器上,也没办法及时回复……也许如果有很好的条件,这段代码就可以运行了吧…… </p><p> |
|
|
我也试过如果不是Pixiv上面的图片,而是图片在很小而且也很快的服务器上时,这个代码是能运行的。</p> |
|
|
<h1 id="替代的方案"> |
|
|
|
|
|
|
|
|
<a href="#替代的方案"><svg class='octicon' viewBox='0 0 16 16' version='1.1' width='16' height='32' aria-hidden='true'><path fill-rule='evenodd' d='M7.775 3.275a.75.75 0 001.06 1.06l1.25-1.25a2 2 0 112.83 2.83l-2.5 2.5a2 2 0 01-2.83 0 .75.75 0 00-1.06 1.06 3.5 3.5 0 004.95 0l2.5-2.5a3.5 3.5 0 00-4.95-4.95l-1.25 1.25zm-4.69 9.64a2 2 0 010-2.83l2.5-2.5a2 2 0 012.83 0 .75.75 0 001.06-1.06 3.5 3.5 0 00-4.95 0l-2.5 2.5a3.5 3.5 0 004.95 4.95l1.25-1.25a.75.75 0 00-1.06-1.06l-1.25 1.25a2 2 0 01-2.83 0z'></path></svg></a> 替代的方案 |
|
|
|
|
|
|
|
|
</h1> |
|
|
|
|
|
<p>我看完文档之后好像也没有主动向用户发送信息的接口,只有被动发送的,那这5秒问题估计是没法解决了吧……不过我看网上说如果用客服接口好像就没有这样的限制,总之我回头试试看吧。 </p><p> |
|
|
另外我也想了几种方案:</p> |
|
|
<ol> |
|
|
<li>每天定时向微信服务器上传图片,需要时只发送ID,不再在得到请求时再上传。</li> |
|
|
<li>设置2条命令,一条用于向微信服务器上传,另一条负责取回。不过这样有个问题就是ID不太好传,可能还得缓存一下,其实上面那个一样也得缓存。</li> |
|
|
<li>搞成图文形式,每天定时发送,就像日报一样</li> |
|
|
</ol> |
|
|
|
|
|
<p>目前大概就想出这么多,更多的睡起来再慢慢想吧~</p></main> |
|
|
|
|
|
|
|
|
<small style="display: block">tags: <a rel="category tag" class="p-category" href="/search.html?keyword=%E5%BE%AE%E4%BF%A1"><em>微信</em></a> - <a rel="category tag" class="p-category" href="/search.html?keyword=%E8%81%8A%E5%A4%A9"><em>聊天</em></a> - <a rel="category tag" class="p-category" href="/search.html?keyword=%E6%9C%BA%E5%99%A8%E4%BA%BA"><em>机器人</em></a> - <a rel="category tag" class="p-category" href="/search.html?keyword=PHP"><em>PHP</em></a> <span style="float: right;"><a href="https://gitlab.com/mayx/mayx.gitlab.io/tree/master/_posts/2021-02-06-wechatbot.md">查看原始文件</a></span></small> |
|
|
|
|
|
|
|
|
<h4 style="border-bottom: 1px solid #e5e5e5;margin: 2em 0 5px;">推荐文章</h4> |
|
|
<p id="suggest-container">Loading...</p> |
|
|
<script> |
|
|
var suggest = $("#suggest-container"); |
|
|
$.get(BlogAPI + "/suggest?id=/2021/02/06/wechatbot.html&update=" + lastUpdated.valueOf(), function (data) { |
|
|
if (data.length) { |
|
|
getSearchJSON(function (search) { |
|
|
suggest.empty(); |
|
|
var searchMap = {}; |
|
|
for (var i = 0; i < search.length; i++) { |
|
|
searchMap[search[i].url] = search[i]; |
|
|
} |
|
|
|
|
|
var tooltip = $('<div class="content-tooltip"></div>').appendTo('body').hide(); |
|
|
for (var j = 0; j < data.length; j++) { |
|
|
var item = searchMap[data[j].id]; |
|
|
if (item) { |
|
|
var link = $('<a href="' + item.url + '">' + item.title + '</a>'); |
|
|
var contentPreview = item.content.substring(0, 100); |
|
|
if (item.content.length > 100) { |
|
|
contentPreview += "……"; |
|
|
} |
|
|
link.hover( |
|
|
function(e) { |
|
|
tooltip.text($(this).data('content')) |
|
|
.css({ |
|
|
top: e.pageY + 10, |
|
|
left: e.pageX + 10 |
|
|
}) |
|
|
.show(); |
|
|
}, |
|
|
function() { |
|
|
tooltip.hide(); |
|
|
} |
|
|
).mousemove(function(e) { |
|
|
tooltip.css({ |
|
|
top: e.pageY + 10, |
|
|
left: e.pageX + 10 |
|
|
}); |
|
|
}).data('content', contentPreview); |
|
|
|
|
|
suggest.append(link); |
|
|
suggest.append(' - ' + item.date + '<br />'); |
|
|
} |
|
|
} |
|
|
}); |
|
|
} else { |
|
|
suggest.html("暂无推荐文章……"); |
|
|
} |
|
|
}); |
|
|
</script> |
|
|
|
|
|
<br /> |
|
|
<div class="pagination"> |
|
|
|
|
|
<span class="prev"> |
|
|
<a href="/2021/02/02/serverchan.html"> |
|
|
上一篇:自己动手做一个Server酱·TurboMini版 |
|
|
</a> |
|
|
</span> |
|
|
|
|
|
<br /> |
|
|
|
|
|
<span class="next"> |
|
|
<a href="/2021/02/09/try2.html"> |
|
|
下一篇:Mayx的产品测评(二) |
|
|
</a> |
|
|
</span> |
|
|
|
|
|
</div> |
|
|
|
|
|
|
|
|
<link rel="stylesheet" href="/assets/css/gitalk.css"> |
|
|
<script src="/assets/js/gitalk.min.js"></script> |
|
|
|
|
|
<div id="gitalk-container"></div> |
|
|
|
|
|
<script> |
|
|
var gitalk = new Gitalk({ |
|
|
clientID: '36557aec4c3cb04f7ac6', |
|
|
clientSecret: 'ac32993299751cb5a9ba81cf2b171cca65879cdb', |
|
|
repo: 'mabbs.github.io', |
|
|
owner: 'Mabbs', |
|
|
admin: ['Mabbs'], |
|
|
id: '/2021/02/06/wechatbot', |
|
|
distractionFreeMode: false, |
|
|
proxy: "https://cors-anywhere.mayx.eu.org/?https://github.com/login/oauth/access_token" |
|
|
}) |
|
|
gitalk.render('gitalk-container') |
|
|
</script> |
|
|
|
|
|
|
|
|
</section> |
|
|
|
|
|
<div id="landlord" style="left:5px;bottom:0px;"> |
|
|
<div class="message" style="opacity:0"></div> |
|
|
<canvas id="live2d" width="500" height="560" class="live2d"></canvas> |
|
|
<div class="live_talk_input_body"> |
|
|
<form id="live_talk_input_form"> |
|
|
<div class="live_talk_input_name_body" > |
|
|
<input type="checkbox" id="load_this" /> |
|
|
<input type="hidden" id="post_id" value="/2021/02/06/wechatbot.html" /> |
|
|
<label for="load_this"> |
|
|
<span style="font-size: 11px; color: #fff;"> 想问这篇文章</span> |
|
|
</label> |
|
|
</div> |
|
|
<div class="live_talk_input_text_body"> |
|
|
<input name="talk" type="text" class="live_talk_talk white_input" id="AIuserText" autocomplete="off" placeholder="要和我聊什么呀?" /> |
|
|
<button type="submit" class="live_talk_send_btn" id="talk_send">发送</button> |
|
|
</div> |
|
|
</form> |
|
|
</div> |
|
|
<input name="live_talk" id="live_talk" value="1" type="hidden" /> |
|
|
<div class="live_ico_box" style="display:none;"> |
|
|
<div class="live_ico_item type_info" id="showInfoBtn"></div> |
|
|
<div class="live_ico_item type_talk" id="showTalkBtn"></div> |
|
|
<div class="live_ico_item type_music" id="musicButton"></div> |
|
|
<div class="live_ico_item type_youdu" id="youduButton"></div> |
|
|
<div class="live_ico_item type_quit" id="hideButton"></div> |
|
|
<input name="live_statu_val" id="live_statu_val" value="0" type="hidden" /> |
|
|
<audio src="" style="display:none;" id="live2d_bgm" data-bgm="0" preload="none"></audio> |
|
|
<input id="duType" value="douqilai" type="hidden" /> |
|
|
</div> |
|
|
</div> |
|
|
<div id="open_live2d">召唤伊斯特瓦尔</div> |
|
|
|
|
|
<footer> |
|
|
<p> |
|
|
<small>Made with ❤ by Mayx<br />Last updated at 2026-01-17 17:35:52<br /> 总字数:614622 - 文章数:178 - <a href="/atom.xml" >Atom</a> - <a href="/README.html" >About</a></small> |
|
|
</p> |
|
|
</footer> |
|
|
</div> |
|
|
<script src="/assets/js/scale.fix.js"></script> |
|
|
|
|
|
<script src="/assets/js/main_new.js"></script> |
|
|
<script src="/Live2dHistoire/live2d/js/live2d.js"></script> |
|
|
<script src="/Live2dHistoire/live2d/js/message.js"></script> |
|
|
|
|
|
</body> |
|
|
</html> |
|
|
|