mirror of
https://codeberg.org/mayx/pages
synced 2026-01-02 02:03:40 +08:00
update
This commit is contained in:
441
2021/02/19/picbot.html
Normal file
441
2021/02/19/picbot.html
Normal file
@@ -0,0 +1,441 @@
|
||||
<!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="微信?不好。PHP?好!" />
|
||||
<meta property="og:description" content="微信?不好。PHP?好!" />
|
||||
<meta property="og:site_name" content="Mayx的博客" />
|
||||
<meta property="og:type" content="article" />
|
||||
<meta property="article:published_time" content="2021-02-19T00: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-19T00:00:00+08:00","datePublished":"2021-02-19T00:00:00+08:00","description":"微信?不好。PHP?好!","headline":"如何制作一个能发好图的微信机器人","mainEntityOfPage":{"@type":"WebPage","@id":"/2021/02/19/picbot.html"},"publisher":{"@type":"Organization","logo":{"@type":"ImageObject","url":"https://avatars0.githubusercontent.com/u/17966333"},"name":"mayx"},"url":"/2021/02/19/picbot.html"}</script>
|
||||
<!-- End Jekyll SEO tag -->
|
||||
|
||||
<link rel="canonical" href="https://mabbs.github.io/2021/02/19/picbot.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=1767196818" />
|
||||
<!--[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("Thu, 01 Jan 2026 00:00:18 +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;" />
|
||||
|
||||
|
||||
<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-19T00:00:00+08:00">19 February 2021</time> - 字数统计:5220 - 阅读大约需要16分钟 - Hits: <span id="/2021/02/19/picbot.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("Fri, 19 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">这篇文章主要讲述了作者如何制作一个微信机器人,从最初的失败尝试转向使用PHP和第三方API,特别是图灵机器人和Lolicon API,来发送图片。作者先是描述了失败的聊天机器人尝试,然后发现可以通过微信客服接口实现图片发送,关键环节包括获取用户输入、调用相应API获取图片、并发送到用户微信。文章还提到在遇到Lolicon API Key次数限制时,会采取备用策略。最后,更新信息说明了在Key不足时如何处理access_token问题。</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>微信?不好。PHP?好!<!--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/06/wechatbot.html">聊天机器人</a>,但是很可惜,人家图灵机器人支持一键接入微信公众号,哦,当然测试号不行,总而言之做那个什么聊天机器人毫无意义,而且我还用的是V1的API,功能根本就没发挥出来。 </p><p>
|
||||
总之,既然目标是做图片机器人,那么就不能就聊天机器人而满足了,正好,今天看到群友分享了一个不错的<a href="https://api.lolicon.app/">API</a>,文档写的很清晰,而且功能不错,我反正也懒得去思考要怎么搞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>既然图源有了,那么要怎么发送图片呢?既然听别人说可以用什么客服接口,那就再仔细看看那个文档呗。我以前以为那个客服接口必须要生成客服账号啥的很麻烦就没怎么看,后来发现好像不用,而且只要用户发一句话,在48小时内都可以调用这个接口给用户发消息,那这么看来就很棒了啊,我还以为只有5秒内被动回复一种方法,这样我可以直接整个异步过去。具体API的用法可以去看<a href="https://developers.weixin.qq.com/doc/offiaccount/Message_Management/Service_Center_messages.html#7">微信开放文档</a>。</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="nv">$apikey</span><span class="o">=</span><span class="s1">'Lolicon API Key'</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">$picurl</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.lolicon.app/setu/?r18=1&size1200=1&apikey='</span><span class="mf">.</span><span class="nv">$apikey</span><span class="p">),</span><span class="kc">true</span><span class="p">)[</span><span class="s1">'data'</span><span class="p">][</span><span class="mi">0</span><span class="p">][</span><span class="s1">'url'</span><span class="p">];</span>
|
||||
<span class="k">if</span><span class="p">(</span><span class="o">!</span><span class="nv">$picurl</span><span class="p">){</span>
|
||||
<span class="nv">$picurl</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.lolicon.app/setu/?r18=1&size1200=1'</span><span class="p">),</span><span class="kc">true</span><span class="p">)[</span><span class="s1">'data'</span><span class="p">][</span><span class="mi">0</span><span class="p">][</span><span class="s1">'url'</span><span class="p">];</span>
|
||||
<span class="p">}</span>
|
||||
<span class="k">if</span><span class="p">(</span><span class="o">!</span><span class="nv">$picurl</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":"text",
|
||||
"text":
|
||||
{
|
||||
"content":"很抱歉,获取失败,可能是API次数达到上限,请明天再试"
|
||||
}
|
||||
}'</span><span class="p">))));</span>
|
||||
<span class="k">exit</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.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="nb">file_get_contents</span><span class="p">(</span><span class="nv">$picurl</span><span class="p">)</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="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="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">'<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="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.19更新:当Lolicon API Key次数不够时会尝试不使用Key调用,增加了缓存<code class="language-plaintext highlighter-rouge">access_token</code>的功能。另外以后我会自己搞一个图片API,免得总是被这个每天只有300次调用的垃圾API所限制。 </p><p>
|
||||
2021.02.21更新:上次不知道怎么就脑残的用了调用次数只有500次的获取用户接口作为检查<code class="language-plaintext highlighter-rouge">access_token</code>的依据,这次换了个没有上限的,另外把session的回收时间改成了2个小时,和接口对应。</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/06/wechatbot.html#%E4%BD%BF%E7%94%A8%E6%96%B9%E6%B3%95">上一篇</a>一样,不过有一个不一样的地方就是这里需要一个Lolicon API Key,如果没有的话好像限制非常高,可能一天只能调用1-2次吧,有API Key好像可以每天请求300次,具体怎么用可以看<a href="https://api.lolicon.app/#/setu">他们的文档</a>。 </p><p>
|
||||
API Key的申请方式是去找他们的Telegram机器人<a href="https://t.me/loliconApiBot">@loliconApiBot</a>,倒是还挺简单的,申请出一个API和一个测试号可以供100人使用,这一点还是挺不错的。 </p><p>
|
||||
最后做好了就可以向测试号发送来点什么图?关键词可以自己在代码里改。 </p><p>
|
||||
如果不想整图灵机器人也行,那个东西要实名还是挺麻烦的,不过这样聊天功能就不能正常工作了 <del>(谁用这个机器人是和聊天机器人聊天啊!)</del> 。 </p><p>
|
||||
另外PHP空间很好申请的,相比Python还是非常有性价比的,至少可以不用租服务器。</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>这次代码用了不少有意思的特性,比如通过<code class="language-plaintext highlighter-rouge">file_get_contents</code>直接上传文件,以及PHP异步之类的,这个异步的功能还是我自己想出来的哦,现在在百度上都不一定能搜到我这样的方法。 </p><p>
|
||||
总之PHP还是挺有意思的。</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-19-picbot.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/19/picbot.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/09/try2.html">
|
||||
上一篇:Mayx的产品测评(二)
|
||||
</a>
|
||||
</span>
|
||||
|
||||
<br />
|
||||
|
||||
<span class="next">
|
||||
<a href="/2021/02/23/picbotpro.html">
|
||||
下一篇:快速自制微信图片机器人
|
||||
</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/19/picbot', // 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/19/picbot.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-01-01 00:00:18<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>
|
||||
<!--[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>
|
||||
Reference in New Issue
Block a user