File size: 35,566 Bytes
c61b62a | 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 374 375 376 377 378 379 380 381 382 383 384 385 386 387 388 389 390 391 392 393 394 395 396 397 398 399 400 401 402 403 404 405 406 407 408 409 410 411 412 413 414 415 416 417 | <!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" />
<!-- Begin Jekyll SEO tag v2.8.0 -->
<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="优化真的是很复杂啊……" />
<meta property="og:description" content="优化真的是很复杂啊……" />
<meta property="og:site_name" content="Mayx的博客" />
<meta property="og:type" content="article" />
<meta property="article:published_time" content="2021-02-23T00: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-23T00:00:00+08:00","datePublished":"2021-02-23T00:00:00+08:00","description":"优化真的是很复杂啊……","headline":"快速自制微信图片机器人","mainEntityOfPage":{"@type":"WebPage","@id":"/2021/02/23/picbotpro.html"},"publisher":{"@type":"Organization","logo":{"@type":"ImageObject","url":"https://avatars0.githubusercontent.com/u/17966333"},"name":"mayx"},"url":"/2021/02/23/picbotpro.html"}</script>
<!-- End Jekyll SEO tag -->
<link rel="canonical" href="https://mabbs.github.io/2021/02/23/picbotpro.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=1777206586" />
<!--[if !IE]> -->
<link rel="stylesheet" href="/Live2dHistoire/live2d/css/live2d.css" />
<!-- <![endif]-->
<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>
<!--[if lt IE 9]>
<script src="//cdnjs.cloudflare.com/ajax/libs/html5shiv/3.7.3/html5shiv.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/jquery-ajaxtransport-xdomainrequest/1.0.3/jquery.xdomainrequest.min.js"></script>
<script src="//cdnjs.cloudflare.com/ajax/libs/respond.js/1.4.2/respond.min.js"></script>
<![endif]-->
<script>
var lastUpdated = new Date("Sun, 26 Apr 2026 20:29:46 +0800");
var BlogAPI = "https://summary.mayx.eu.org";
</script>
<script src="/assets/js/main.js"></script>
<!--[if !IE]> -->
<!-- Global site tag (gtag.js) - Google Analytics -->
<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>
<!-- <![endif]-->
</head>
<body>
<!--[if !IE]> --><noscript><marquee style="top: -15px; position: relative;"><small>发现当前浏览器没有启用JavaScript,这不影响你的浏览,但可能会有一些功能无法使用……</small></marquee></noscript><!-- <![endif]-->
<!--[if IE]><marquee style="top: -15px; position: relative;"><small>发现当前浏览器为Internet Explorer,这不影响你的浏览,但可能会有一些功能无法使用……</small></marquee><![endif]-->
<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; border-radius: 25%;" />
<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-23T00:00:00+08:00">23 February 2021</time> - 字数统计:4456 - 阅读大约需要14分钟 - Hits: <span id="/2021/02/23/picbotpro.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("Tue, 23 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">这篇文章讲述了作者自制微信图片发送机器人的经历,包括了遇到的问题和解决过程。主要问题包括:频繁获取微信access_token导致次数限制,以及Lolicon API的调用次数限制。为了解决这些,作者改进了代码,设置了缓存来存储API返回的结果,并创建了一个仓库来存储Pixiv API的缩略图。然而,API中的图片数量较少,这限制了可供调用的图片量。文章结尾提到将考虑使用其他图片资源作为替代。</p>
<hr />
<ul><li><a href="#起因">起因</a></li><li><a href="#解决api调用次数过少的问题">解决API调用次数过少的问题</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>优化真的是很复杂啊……<!--more--></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/19/picbot.html">能发图片的机器人</a>,做出来之后我拿给群友们体验,但是很遗憾的是那个代码实在是不太行,首先有2个问题,第一是微信获取<code class="language-plaintext highlighter-rouge">access_token</code>的次数是有限的,我的第一版代码在每一次调用都去获取<code class="language-plaintext highlighter-rouge">access_token</code>,这样很快次数就会消耗光,后来我稍微改进了一下,设置了个缓存,结果呢,我检测的时候用了次数更少的接口……简直是太蠢了……之后呢?结果今天发现代码里有两个获取<code class="language-plaintext highlighter-rouge">access_token</code>的地方,缓存完全没起到作用…… </p><p>
总之上面的问题各种波折总算是解决好了,然后还有一个问题是我的图片来源是<a href="https://api.lolicon.app/setu">Lolicon API</a>,然后调用限制是300次/天,说实话,对于一个人来说这个数量是够了,但是如果有很多人,像测试号最多能容纳100人,那每天每人也就只有3次调用的机会。 </p><p>
那要怎么解决调用次数的问题呢?我首先想的就是缓存结果。</p>
<h1 id="解决api调用次数过少的问题">
<a href="#解决api调用次数过少的问题"><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> 解决API调用次数过少的问题
</h1>
<p>因为对于图片来说,基本上没有什么变化的信息,所以如果能将每一次的结果缓存的话其实也没有问题。所以说干就干,我单独开了一个仓库<a href="https://github.com/Mabbs/pixiv-index">pixiv-index</a>用来存储缓存的结果,具体代码的话都在这个仓库里面,每天会调用那个API直到用完次数。 </p><p>
考虑到大多数情况下也不需要原图,所以这个API里的图片都只是长或宽最大为1200px的缩略图。 </p><p>
使用方法也很简单,像PHP的话就可以这样写:</p>
<div class="language-php highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp"><?php</span>
<span class="nv">$raw</span><span class="o">=</span><span class="nb">json_decode</span><span class="p">(</span><span class="nb">file_get_contents</span><span class="p">(</span><span class="s2">"https://mabbs.github.io/pixiv-index/index.json"</span><span class="p">),</span><span class="kc">true</span><span class="p">);</span>
<span class="k">echo</span> <span class="nb">file_get_contents</span><span class="p">(</span><span class="s1">'https://mabbs.github.io/pixiv-index/data/'</span><span class="mf">.</span><span class="nv">$raw</span><span class="p">[</span><span class="nb">rand</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="nb">count</span><span class="p">(</span><span class="nv">$raw</span><span class="p">)</span><span class="o">-</span><span class="mi">1</span><span class="p">)]);</span>
</code></pre></div></div>
<p>虽然问题解决了,但是我发现了一个巨大的缺陷,我设计这个脚本的初心是想着它有非常多的数据供我调用,结果我发现我错了,之前没有仔细看他们的文档,现在看了才发现,我想要的图片他们也只有仅仅3361张而已,实在是太少了,而总共的图片数量也只有17285张而已(即使那个站的数据也在以非常缓慢的速度增加)…… </p><p>
我只是懒得去别的地方找,而且因为这个API作者说那些图片都是Ta精心挑选的我才特意写了那个仓库的那些脚本,还特地学了一下Github Action…… <del>(虽然实际上是抄的那个<a href="https://github.com/wangziyingwen/AutoApiSecret">给开发者账号续命的</a>那个仓库lol)</del></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>解决了那些问题之后我又稍微优化了一下,把聊天机器人的功能剥离掉了,免得那个图灵机器人的API让人混乱。</p>
<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="s1">'微信appID'</span><span class="p">;</span>
<span class="nv">$secret</span><span class="o">=</span><span class="s1">'微信appsecret'</span><span class="p">;</span>
<span class="nv">$token</span><span class="o">=</span><span class="s1">'和配置的Token配置一致即可'</span><span class="p">;</span>
<span class="nv">$source</span><span class="o">=</span><span class="s1">'https://i.pximg.net'</span><span class="p">;</span>
<span class="nb">ini_set</span><span class="p">(</span><span class="s1">'session.gc_maxlifetime'</span><span class="p">,</span> <span class="mi">7200</span><span class="p">);</span>
<span class="nb">ignore_user_abort</span><span class="p">(</span><span class="kc">true</span><span class="p">);</span>
<span class="nb">set_time_limit</span><span class="p">(</span><span class="mi">0</span><span class="p">);</span>
<span class="nb">session_id</span><span class="p">(</span><span class="s1">'Storage'</span><span class="p">);</span>
<span class="nb">session_start</span><span class="p">();</span>
<span class="k">if</span><span class="p">(</span><span class="o">!</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/get_api_domain_ip?access_token='</span><span class="mf">.</span><span class="nv">$_SESSION</span><span class="p">[</span><span class="s1">'access_token'</span><span class="p">]),</span><span class="kc">true</span><span class="p">)[</span><span class="s1">'ip_list'</span><span class="p">]){</span>
<span class="nv">$_SESSION</span><span class="p">[</span><span class="s1">'access_token'</span><span class="p">]</span><span class="o">=</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="s1">'access_token'</span><span class="p">];</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">"upap"</span><span class="p">]){</span>
<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">$retry</span><span class="o">=</span><span class="mi">3</span><span class="p">;</span>
<span class="k">while</span><span class="p">(</span><span class="o">!</span><span class="nv">$picdata</span><span class="o">||</span><span class="nv">$retry</span><span class="o"><=</span><span class="mi">0</span><span class="p">){</span>
<span class="nv">$raw</span><span class="o">=</span><span class="nb">json_decode</span><span class="p">(</span><span class="nb">file_get_contents</span><span class="p">(</span><span class="s2">"https://mabbs.github.io/pixiv-index/index.json"</span><span class="p">),</span><span class="kc">true</span><span class="p">);</span>
<span class="nv">$picdata</span><span class="o">=</span><span class="nb">file_get_contents</span><span class="p">(</span><span class="nv">$source</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://mabbs.github.io/pixiv-index/data/'</span><span class="mf">.</span><span class="nv">$raw</span><span class="p">[</span><span class="nb">rand</span><span class="p">(</span><span class="mi">0</span><span class="p">,</span><span class="nb">count</span><span class="p">(</span><span class="nv">$raw</span><span class="p">)</span><span class="o">-</span><span class="mi">1</span><span class="p">)]),</span><span class="kc">true</span><span class="p">)[</span><span class="s1">'url'</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">$retry</span><span class="o">-=</span><span class="mi">1</span><span class="p">;</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.jpg</span><span class="se">\"\r\n</span><span class="s2">"</span><span class="mf">.</span>
<span class="s2">"Content-Type: image/jpg</span><span class="se">\r\n\r\n</span><span class="s2">"</span><span class="mf">.</span>
<span class="nv">$picdata</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="nb">file_get_contents</span><span class="p">(</span><span class="s1">'https://api.weixin.qq.com/cgi-bin/message/custom/send?access_token='</span><span class="mf">.</span><span class="nv">$_SESSION</span><span class="p">[</span><span class="s1">'access_token'</span><span class="p">]</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/json;charset=utf-8'</span><span class="p">,</span><span class="s1">'content'</span> <span class="o">=></span> <span class="s1">'{
"touser":"'</span><span class="mf">.</span><span class="nv">$_GET</span><span class="p">[</span><span class="s2">"openid"</span><span class="p">]</span><span class="mf">.</span><span class="s1">'",
"msgtype":"image",
"image":
{
"media_id":"'</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="nv">$_SESSION</span><span class="p">[</span><span class="s1">'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">'"
}
}'</span><span class="p">))));</span>
<span class="k">exit</span><span class="p">();</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">$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="k">if</span><span class="p">(</span> <span class="nb">sha1</span><span class="p">(</span><span class="nb">implode</span><span class="p">(</span><span class="nv">$tmpArr</span><span class="p">))</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="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="c1">// 加载XML内容</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">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">'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="o">==</span> <span class="s1">'来点色图'</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[开始发起请求,请耐心等待]]></Content>
</xml>'</span><span class="p">;</span>
<span class="nb">file_get_contents</span><span class="p">(</span><span class="s1">'https://'</span><span class="mf">.</span><span class="nv">$_SERVER</span><span class="p">[</span><span class="s1">'HTTP_HOST'</span><span class="p">]</span><span class="mf">.</span><span class="nv">$_SERVER</span><span class="p">[</span><span class="s1">'PHP_SELF'</span><span class="p">]</span><span class="mf">.</span><span class="s1">'?upap=1&openid='</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="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">'timeout'</span> <span class="o">=></span> <span class="mf">0.5</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">'success'</span><span class="p">;</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>
<p>2021.02.26更新:似乎在库中的图片有一些是被删掉了,所以为了提高回复的成功率,增加了3次重试。</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>具体应该不需要我说了吧,看之前的几篇关于微信机器人的文章里面的这段就行了。这里我删掉了2个参数,又增加了2个,一个是Token,想填啥都行,只要和测试号里配置一样就行。另一个是source,那个是Pixiv的图片服务器,如果后端服务器在国外那这个就不用管了,如果在国内的话需要改成<code class="language-plaintext highlighter-rouge">https://i.pixiv.cat</code>来做反代,或者如果有其他反代服务也可以,自己用CloudFlare Worker建一个也没有问题。</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>那个Lolicon API实在是不好用,不过我也懒得解决了,所以就托学弟在做Pixiv日榜的收集,回头看看效果怎么样,实在不行就去研究一下各种各样的什么booru之类的图站吧,用那些图片也是个不错的选择。</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=%E5%9B%BE%E7%89%87"><em>图片</em></a> - <a rel="category tag" class="p-category" href="/search.html?keyword=Pixiv"><em>Pixiv</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-23-picbotpro.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/23/picbotpro.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/19/picbot.html">
上一篇:如何制作一个能发好图的微信机器人
</a>
</span>
<br />
<span class="next">
<a href="/2021/02/26/serverchancorp.html">
下一篇:做一个Server酱·TurboMini企业应用版
</a>
</span>
</div>
<!--[if !IE]> -->
<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/23/picbotpro', // Ensure uniqueness and length less than 50
distractionFreeMode: false, // Facebook-like distraction free mode
proxy: "https://cors-anywhere.mayx.eu.org/?https://github.com/login/oauth/access_token"
})
gitalk.render('gitalk-container')
</script>
<!-- <![endif]-->
</section>
<!--[if !IE]> -->
<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/23/picbotpro.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>
<!-- <![endif]-->
<footer>
<p>
<small>Made with ❤ by Mayx<br />Last updated at 2026-04-26 20:29:46<br /> 总字数:624725 - 文章数:181 - <a href="/rss.xml">Feed</a> - <a href="/README.html" >About</a></small>
</p>
</footer>
</div>
<script src="/assets/js/scale.fix.js"></script>
<!--[if !IE]> -->
<script src="/assets/js/main_new.js"></script>
<script src="/Live2dHistoire/live2d/js/live2d.js"></script>
<script src="/Live2dHistoire/live2d/js/message.js"></script>
<!-- <![endif]-->
</body>
</html>
|