This commit is contained in:
2025-12-31 16:00:29 +00:00
commit 3688f93d5d
310 changed files with 93400 additions and 0 deletions

339
2021/02/02/serverchan.html Normal file
View File

@@ -0,0 +1,339 @@
<!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>自己动手做一个Server酱·TurboMini版 | Mayx的博客</title>
<meta name="generator" content="Jekyll v3.9.5" />
<meta property="og:title" content="自己动手做一个Server酱·TurboMini版" />
<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-02T00:00:00+08:00" />
<meta name="twitter:card" content="summary" />
<meta property="twitter:title" content="自己动手做一个Server酱·TurboMini版" />
<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-02T00:00:00+08:00","datePublished":"2021-02-02T00:00:00+08:00","description":"一句话就能解决的问题也敢收费?","headline":"自己动手做一个Server酱·TurboMini版","mainEntityOfPage":{"@type":"WebPage","@id":"/2021/02/02/serverchan.html"},"publisher":{"@type":"Organization","logo":{"@type":"ImageObject","url":"https://avatars0.githubusercontent.com/u/17966333"},"name":"mayx"},"url":"/2021/02/02/serverchan.html"}</script>
<!-- End Jekyll SEO tag -->
<link rel="canonical" href="https://mabbs.github.io/2021/02/02/serverchan.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.." />&#160;<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-02T00:00:00+08:00">2 February 2021</time> - 字数统计2047 - 阅读大约需要6分钟 - Hits: <span id="/2021/02/02/serverchan.html" class="visitors">Loading...</span></small>
<h1 class="p-name">自己动手做一个Server酱·TurboMini版</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, 02 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酱·Turbo版收费的不满原本习惯使用Server酱的作者因其服务不稳定而转向自己开发发现通过微信API发送模板消息非常简单一行PHP代码就能实现并强调自己的实现比Server酱的限制更好每天发送量理论上可达2000次到100000次。作者在文章中提供了设置参数的步骤并讽刺了Server酱的收费行为认为开发者不应该为此类基础功能付费。</p>
<hr />
<ul><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>一句话就能解决的问题也敢收费?<!--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>我以前经常使用Server酱给我推送日报或者告诉我树莓派有没有正常启动之类的事情。之所以使用它是因为那个API还是挺方便的而且我平时微信也用的多能直接通过微信推送信息也挺不错的。 </p><p>
后来Server酱整了个什么Turbo版不过我用普通版用的挺好就没怎么管。结果今天发了个什么通知说他们的服务有可能要挂我这个人最讨厌的就是服务不稳定连个服务都整不稳定的人干脆别做服务了做出来那不是害人嘛像之前那个什么LeanCloud就不行因此我还<a href="/2019/06/22/counter.html">自己写了一个博客计数器</a></p><p>
然后我就看了看他们的Server酱·Turbo版好家伙还是收费的8CNY/mo有点过分啊也不过是调用微信接口还要花钱看了之后我说不行这个太贵了我倒要看看这东西到底要花多少资源。 </p><p>
之前我就看他们吹说自己月请求数5kw我说这有啥我花火学园每个月请求数要上亿也花不了几个钱5kw就敢出来吹还敢开课所以今天我就来看看这所谓的“配置略显复杂”到底有多复杂。</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>我看了下微信关于测试号的接口文档看起来也没多复杂嘛我估摸了一下最多一句话就能搞定然后就试着用PHP写了一下。 </p><p>
最终的代码如下:</p>
<div class="language-php highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">&lt;?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">$userid</span><span class="o">=</span><span class="s1">'微信号OpenID'</span><span class="p">;</span>
<span class="nv">$template_id</span><span class="o">=</span><span class="s1">'模板ID'</span><span class="p">;</span>
<span class="nv">$title</span><span class="o">=</span><span class="s1">'标题'</span><span class="p">;</span>
<span class="nv">$content</span><span class="o">=</span><span class="s1">'内容'</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/template/send?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&amp;appid='</span><span class="mf">.</span><span class="nv">$appid</span><span class="mf">.</span><span class="s1">'&amp;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="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">=&gt;</span> <span class="k">array</span><span class="p">(</span><span class="s1">'method'</span><span class="o">=&gt;</span><span class="s1">'POST'</span><span class="p">,</span><span class="s1">'header'</span><span class="o">=&gt;</span><span class="s2">"Content-Type: application/json;charset=utf-8"</span><span class="p">,</span><span class="s1">'content'</span><span class="o">=&gt;</span><span class="s1">'{"touser":"'</span><span class="mf">.</span><span class="nv">$userid</span><span class="mf">.</span><span class="s1">'","template_id":"'</span><span class="mf">.</span><span class="nv">$template_id</span><span class="mf">.</span><span class="s1">'","data":{"title": {"value":"'</span><span class="mf">.</span><span class="nv">$title</span><span class="mf">.</span><span class="s1">'"},"content": {"value":"'</span><span class="mf">.</span><span class="nv">$content</span><span class="mf">.</span><span class="s1">'"}}}'</span><span class="p">))));</span>
</code></pre></div></div>
<p>写好之后测试了一下效果还不错和Server酱测试号的效果几乎一模一样除了没有能点开的网页当然要想搞也行很简单就插一个URL就可以了如果你希望整些更多的特效也可以去<a href="https://developers.weixin.qq.com/doc/offiaccount/Message_Management/Template_Message_Interface.html">模板接口文档</a>里面看。 </p><p>
关于限制方面的话也要比Server酱要好理论上我的代码每天能发送2000次主要是因为获取access_token的接口每天只能使用2000次不过如果能缓存access_token的话理论上每天能发送100000次要比垃圾Server酱的1000次好得多。</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>我写的代码是兼容Server酱的所以跟着他们的配置指南也可以直接用不过有人可能连Server酱是啥都不知道我也不给他们引流了免得浪费他们珍贵的服务器资源。 </p><p>
要做的事情很简单,首先打开<a href="https://mp.weixin.qq.com/debug/cgi-bin/sandbox?t=sandbox/login">申请页面</a>,然后扫码登录,成功之后就能看到测试号管理的页面了。 </p><p>
首先看到的是appID和appsecret这样我们就已经获得了两个参数。另外两个的话就继续往下翻找到测试号二维码用微信扫描关注后就会出现自己的微信号当然这个不是真正的微信号相当于只是一个识别码这样第三个参数也得到了。接下来是第四个参数找到模板消息接口点击新增测试模板标题输入推送通知或者你喜欢的啥都行内容的话填</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>{{title.DATA}}
{{content.DATA}}
</code></pre></div></div>
<p>之所以这样填是为了兼容Server酱当然也可以自己改代码然后填别的也行。不过如果不想改代码在末尾加个签名也没有问题比如说这样</p>
<div class="language-plaintext highlighter-rouge"><div class="highlight"><pre class="highlight"><code>{{title.DATA}}
{{content.DATA}}
--By Mayx
</code></pre></div></div>
<p>这样第四个参数模板ID我们也得到了这样上面的代码应该可以正常使用了。 </p><p>
需要注意的一点是由于莫名其妙的原因有可能扫码后第一次得到的appsecret是错的如果代码不能正常工作可以刷新测试号管理的页面看看有没有变化如果有就输入最新的appsecret。</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>我觉得作为开发者,这种简单的小活就自己干吧,没必要给所谓不赞助就不能用功能的开发者给钱,我觉得既然叫赞助,就不能有差别待遇,不然这就叫做收费,就是商业行为,不要用赞助这种词给自己的资本家行为贴金。</p></main>
<small style="display: block">tags: <a rel="category tag" class="p-category" href="/search.html?keyword=Server"><em>Server</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-02-serverchan.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/02/serverchan.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/01/17/picore.html">
上一篇piCore的使用经历
</a>
</span>
<br />
<span class="next">
<a href="/2021/02/06/wechatbot.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/02/serverchan', // 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/02/serverchan.html" />
<label for="load_this">
<span style="font-size: 11px; color: #fff;">&#160;想问这篇文章</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>

404
2021/02/06/wechatbot.html Normal file
View File

@@ -0,0 +1,404 @@
<!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="感觉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>
<!-- End Jekyll SEO tag -->
<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=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.." />&#160;<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好像还挺有意思<!--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/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">&lt;?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">'&lt;xml&gt;
&lt;ToUserName&gt;&lt;![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">']]&gt;&lt;/ToUserName&gt;
&lt;FromUserName&gt;&lt;![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">']]&gt;&lt;/FromUserName&gt;
&lt;CreateTime&gt;'</span><span class="mf">.</span><span class="nb">time</span><span class="p">()</span><span class="mf">.</span><span class="s1">'&lt;/CreateTime&gt;
&lt;MsgType&gt;&lt;![CDATA[text]]&gt;&lt;/MsgType&gt;
&lt;Content&gt;&lt;![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">=&gt;</span> <span class="k">array</span><span class="p">(</span><span class="s1">'method'</span> <span class="o">=&gt;</span> <span class="s1">'POST'</span><span class="p">,</span><span class="s1">'header'</span> <span class="o">=&gt;</span> <span class="s1">'Content-type:application/x-www-form-urlencoded'</span><span class="p">,</span><span class="s1">'content'</span> <span class="o">=&gt;</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">=&gt;</span> <span class="nv">$appkey</span><span class="p">,</span><span class="s1">'info'</span> <span class="o">=&gt;</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">=&gt;</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">']]&gt;&lt;/Content&gt;
&lt;/xml&gt;'</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">=&gt;</span> <span class="k">array</span><span class="p">(</span><span class="s1">'method'</span> <span class="o">=&gt;</span> <span class="s1">'GET'</span><span class="p">,</span><span class="s1">'header'</span> <span class="o">=&gt;</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">=&gt;</span> <span class="k">array</span><span class="p">(</span>
<span class="s1">'method'</span> <span class="o">=&gt;</span> <span class="s1">'POST'</span><span class="p">,</span>
<span class="s1">'header'</span> <span class="o">=&gt;</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">=&gt;</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">'&lt;xml&gt;
&lt;ToUserName&gt;&lt;![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">']]&gt;&lt;/ToUserName&gt;
&lt;FromUserName&gt;&lt;![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">']]&gt;&lt;/FromUserName&gt;
&lt;CreateTime&gt;'</span><span class="mf">.</span><span class="nb">time</span><span class="p">()</span><span class="mf">.</span><span class="s1">'&lt;/CreateTime&gt;
&lt;MsgType&gt;&lt;![CDATA[image]]&gt;&lt;/MsgType&gt;
&lt;Image&gt;
&lt;MediaId&gt;&lt;![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&amp;appid='</span><span class="mf">.</span><span class="nv">$appid</span><span class="mf">.</span><span class="s1">'&amp;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">'&amp;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">']]&gt;&lt;/MediaId&gt;
&lt;/Image&gt;
&lt;/xml&gt;'</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>
<!--[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/06/wechatbot', // 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/06/wechatbot.html" />
<label for="load_this">
<span style="font-size: 11px; color: #fff;">&#160;想问这篇文章</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>

267
2021/02/09/try2.html Normal file

File diff suppressed because one or more lines are too long

441
2021/02/19/picbot.html Normal file
View 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.." />&#160;<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">&lt;?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&amp;appid='</span><span class="mf">.</span><span class="nv">$appid</span><span class="mf">.</span><span class="s1">'&amp;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&amp;size1200=1&amp;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&amp;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">=&gt;</span> <span class="k">array</span><span class="p">(</span><span class="s1">'method'</span> <span class="o">=&gt;</span> <span class="s1">'POST'</span><span class="p">,</span><span class="s1">'header'</span> <span class="o">=&gt;</span> <span class="s1">'Content-type: application/json;charset=utf-8'</span><span class="p">,</span><span class="s1">'content'</span> <span class="o">=&gt;</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">=&gt;</span> <span class="k">array</span><span class="p">(</span>
<span class="s1">'method'</span> <span class="o">=&gt;</span> <span class="s1">'POST'</span><span class="p">,</span>
<span class="s1">'header'</span> <span class="o">=&gt;</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">=&gt;</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">=&gt;</span> <span class="k">array</span><span class="p">(</span><span class="s1">'method'</span> <span class="o">=&gt;</span> <span class="s1">'POST'</span><span class="p">,</span><span class="s1">'header'</span> <span class="o">=&gt;</span> <span class="s1">'Content-type: application/json;charset=utf-8'</span><span class="p">,</span><span class="s1">'content'</span> <span class="o">=&gt;</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">'&amp;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">'&lt;xml&gt;
&lt;ToUserName&gt;&lt;![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">']]&gt;&lt;/ToUserName&gt;
&lt;FromUserName&gt;&lt;![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">']]&gt;&lt;/FromUserName&gt;
&lt;CreateTime&gt;'</span><span class="mf">.</span><span class="nb">time</span><span class="p">()</span><span class="mf">.</span><span class="s1">'&lt;/CreateTime&gt;
&lt;MsgType&gt;&lt;![CDATA[text]]&gt;&lt;/MsgType&gt;
&lt;Content&gt;&lt;![CDATA[开始发起请求,请耐心等待]]&gt;&lt;/Content&gt;
&lt;/xml&gt;'</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&amp;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">=&gt;</span> <span class="k">array</span><span class="p">(</span><span class="s1">'timeout'</span> <span class="o">=&gt;</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">'&lt;xml&gt;
&lt;ToUserName&gt;&lt;![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">']]&gt;&lt;/ToUserName&gt;
&lt;FromUserName&gt;&lt;![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">']]&gt;&lt;/FromUserName&gt;
&lt;CreateTime&gt;'</span><span class="mf">.</span><span class="nb">time</span><span class="p">()</span><span class="mf">.</span><span class="s1">'&lt;/CreateTime&gt;
&lt;MsgType&gt;&lt;![CDATA[text]]&gt;&lt;/MsgType&gt;
&lt;Content&gt;&lt;![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">=&gt;</span> <span class="k">array</span><span class="p">(</span><span class="s1">'method'</span> <span class="o">=&gt;</span> <span class="s1">'POST'</span><span class="p">,</span><span class="s1">'header'</span> <span class="o">=&gt;</span> <span class="s1">'Content-type:application/x-www-form-urlencoded'</span><span class="p">,</span><span class="s1">'content'</span> <span class="o">=&gt;</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">=&gt;</span> <span class="nv">$appkey</span><span class="p">,</span><span class="s1">'info'</span> <span class="o">=&gt;</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">=&gt;</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">']]&gt;&lt;/Content&gt;
&lt;/xml&gt;'</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;">&#160;想问这篇文章</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>

415
2021/02/23/picbotpro.html Normal file
View File

@@ -0,0 +1,415 @@
<!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=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.." />&#160;<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">&lt;?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">&lt;?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&amp;appid='</span><span class="mf">.</span><span class="nv">$appid</span><span class="mf">.</span><span class="s1">'&amp;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">&lt;=</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">=&gt;</span> <span class="k">array</span><span class="p">(</span><span class="s1">'method'</span> <span class="o">=&gt;</span> <span class="s1">'GET'</span><span class="p">,</span><span class="s1">'header'</span> <span class="o">=&gt;</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">=&gt;</span> <span class="k">array</span><span class="p">(</span>
<span class="s1">'method'</span> <span class="o">=&gt;</span> <span class="s1">'POST'</span><span class="p">,</span>
<span class="s1">'header'</span> <span class="o">=&gt;</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">=&gt;</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">=&gt;</span> <span class="k">array</span><span class="p">(</span><span class="s1">'method'</span> <span class="o">=&gt;</span> <span class="s1">'POST'</span><span class="p">,</span><span class="s1">'header'</span> <span class="o">=&gt;</span> <span class="s1">'Content-type: application/json;charset=utf-8'</span><span class="p">,</span><span class="s1">'content'</span> <span class="o">=&gt;</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">'&amp;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">'&lt;xml&gt;
&lt;ToUserName&gt;&lt;![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">']]&gt;&lt;/ToUserName&gt;
&lt;FromUserName&gt;&lt;![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">']]&gt;&lt;/FromUserName&gt;
&lt;CreateTime&gt;'</span><span class="mf">.</span><span class="nb">time</span><span class="p">()</span><span class="mf">.</span><span class="s1">'&lt;/CreateTime&gt;
&lt;MsgType&gt;&lt;![CDATA[text]]&gt;&lt;/MsgType&gt;
&lt;Content&gt;&lt;![CDATA[开始发起请求,请耐心等待]]&gt;&lt;/Content&gt;
&lt;/xml&gt;'</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&amp;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">=&gt;</span> <span class="k">array</span><span class="p">(</span><span class="s1">'timeout'</span> <span class="o">=&gt;</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;">&#160;想问这篇文章</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>

View File

@@ -0,0 +1,379 @@
<!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>做一个Server酱·TurboMini企业应用版 | Mayx的博客</title>
<meta name="generator" content="Jekyll v3.9.5" />
<meta property="og:title" content="做一个Server酱·TurboMini企业应用版" />
<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-26T00:00:00+08:00" />
<meta name="twitter:card" content="summary" />
<meta property="twitter:title" content="做一个Server酱·TurboMini企业应用版" />
<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-26T00:00:00+08:00","datePublished":"2021-02-26T00:00:00+08:00","description":"简单的事情应该自己去做","headline":"做一个Server酱·TurboMini企业应用版","mainEntityOfPage":{"@type":"WebPage","@id":"/2021/02/26/serverchancorp.html"},"publisher":{"@type":"Organization","logo":{"@type":"ImageObject","url":"https://avatars0.githubusercontent.com/u/17966333"},"name":"mayx"},"url":"/2021/02/26/serverchancorp.html"}</script>
<!-- End Jekyll SEO tag -->
<link rel="canonical" href="https://mabbs.github.io/2021/02/26/serverchancorp.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.." />&#160;<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-26T00:00:00+08:00">26 February 2021</time> - 字数统计2209 - 阅读大约需要7分钟 - Hits: <span id="/2021/02/26/serverchancorp.html" class="visitors">Loading...</span></small>
<h1 class="p-name">做一个Server酱·TurboMini企业应用版</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, 26 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企业应用版的原因源于Server酱服务即将结束且收费。作者通过对比发现企业微信的应用相比Server酱有自定义主页、更多API调用次数的优点但配置过程稍显复杂且Markdown支持不足。作者指出Server酱的收费和广告过多以及对模板消息功能的误解认为如果去掉了不合理的收费和广告Server酱原本是一个不错的产品。最后作者考虑到Server酱的商业模式认为开发者可能会转向其他选择如利用微信企业微信的功能来替代。</p>
<hr />
<ul><li><a href="#起因">起因</a></li><li><a href="#如何制作">如何制作?</a></li><li><a href="#如何配置">如何配置?</a><ul><li><a href="#第一步注册企业">第一步,注册企业</a></li><li><a href="#第二步创建应用">第二步,创建应用</a></li><li><a href="#第三步获取企业id">第三步获取企业ID</a></li><li><a href="#第四步推送消息到微信">第四步,推送消息到微信</a></li></ul></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>这个月初由于Server酱要挂了然后Turbo版又要钱所以我特地写了一个<a href="/2021/02/02/serverchan.html">Server酱·TurboMini测试号版</a>然而据那个开发Server酱的人说微信要下掉的是模板消息而不是故意坑人不做这个东西了。过了一段时间后那个开发者说可以用企业微信啥的通道继续搞顺便还给普通账户使用Turbo版的一点点权限然后价格似乎也稍微降了一点 </p><p>
但问题是我们之所以使用Server酱只是因为注册服务号很麻烦微信认证要主体所以我们才用用这个的人也应该都是开发者吧那如果说资源都是我们出的话还何必用那个一堆广告的Server酱呢而且想好好用还要花钱都是开发者了没必要交这种智商税吧 </p><p>
不过看在它还给我们推荐了些路子,那也就不用太过分的说它了吧。</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>我也倒是去看了看企业微信的开发文档,和公众号的开发文档那就是大同小异啊,所以今天依然是一句话解决问题:</p>
<div class="language-php highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">&lt;?php</span>
<span class="nv">$cid</span><span class="o">=</span><span class="s1">'企业ID'</span><span class="p">;</span>
<span class="nv">$agentId</span><span class="o">=</span><span class="s1">'应用ID/AgentId'</span><span class="p">;</span>
<span class="nv">$secret</span><span class="o">=</span><span class="s1">'应用Secret'</span><span class="p">;</span>
<span class="nv">$userid</span><span class="o">=</span><span class="s1">'@all'</span><span class="p">;</span><span class="c1">//用户ID不知道可以不改</span>
<span class="nv">$title</span><span class="o">=</span><span class="s1">'标题'</span><span class="p">;</span>
<span class="nv">$content</span><span class="o">=</span><span class="s1">'内容'</span><span class="p">;</span>
<span class="nb">file_get_contents</span><span class="p">(</span><span class="s1">'https://qyapi.weixin.qq.com/cgi-bin/message/send?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://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid='</span><span class="mf">.</span><span class="nv">$cid</span><span class="mf">.</span><span class="s1">'&amp;corpsecret='</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="kc">false</span><span class="p">,</span><span class="nb">stream_context_create</span><span class="p">([</span><span class="s1">'http'</span> <span class="o">=&gt;</span> <span class="k">array</span><span class="p">(</span><span class="s1">'method'</span><span class="o">=&gt;</span><span class="s1">'POST'</span><span class="p">,</span><span class="s1">'header'</span><span class="o">=&gt;</span><span class="s2">"content-type: application/json; charset=UTF-8"</span><span class="p">,</span><span class="s1">'content'</span><span class="o">=&gt;</span><span class="s1">'{"touser":"'</span><span class="mf">.</span><span class="nv">$userid</span><span class="mf">.</span><span class="s1">'","msgtype":"text","agentid":'</span><span class="mf">.</span><span class="nv">$agentId</span><span class="mf">.</span><span class="s1">',"text":{"content":"'</span><span class="mf">.</span><span class="nv">$title</span><span class="mf">.</span><span class="s1">'\n'</span><span class="mf">.</span><span class="nv">$content</span><span class="mf">.</span><span class="s1">'"}}'</span><span class="p">)]));</span>
</code></pre></div></div>
<p>从体验上来说的话这个企业应用版的体验还是不错的和测试号相比首先可以在主页显示虽然有二级但是两边的图标和名字都是可以自定义的而且API的调用次数也要比测试号多很多用起来还是挺不错的和测试号比唯一的缺点应该就是首次配置有点麻烦。 </p><p>
另外我在写这个东西的时候发现这个API还是和测试号的API不太一样测试号那个在发post请求的时候post可以小写但是这个垃圾企业微信的API的POST必须大写不然就400搞得我调试了半天才调试好。</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>一样这个是兼容Server酱的需要的参数和Server酱需要的一样多所以配置也是完全兼容的。不过考虑到Server酱可怜的连每月5kw次请求都受不住配置方法我就在这里再写一遍吧</p>
<h2 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> 第一步,注册企业
</h2>
<p>用电脑打开<a href="https://work.weixin.qq.com/">企业微信官网</a>,注册一个企业</p>
<h2 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> 第二步,创建应用
</h2>
<p>注册成功后,点「管理企业」进入管理界面,选择「应用管理」 → 「自建」 → 「创建应用」 </p><p>
应用名称随便填比如「Mayx的机器人」应用logo随便找一个就行可见范围可以选择自己如果想推送给其他人就选公司。 </p><p>
创建完成后进入应用详情页可以得到应用ID(agentid)应用Secret(secret),复制并填到代码中。</p>
<h2 id="第三步获取企业id">
<a href="#第三步获取企业id"><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> 第三步获取企业ID
</h2>
<p>进入「<a href="https://work.weixin.qq.com/wework_admin/frame#profile">我的企业</a>」页面拉到最下边可以看到企业ID复制并填到上方。 </p><p>
推送UID不知道怎么填就直接填<code class="language-plaintext highlighter-rouge">@all</code>,推送给公司全员。</p>
<h2 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> 第四步,推送消息到微信
</h2>
<p>进入「我的企业」 → 「<a href="https://work.weixin.qq.com/wework_admin/frame#profile/wxPlugin">微信插件</a>」,拉到下边扫描二维码,关注以后即可收到推送的消息。 </p><p>
这里一样图标觉得不好看也可以自己改。</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>首先目前的这个版本是直接发送的信息所以不支持Markdown看起来也很丑。其实呢我看文档里有说可以直接发Markdown消息不过这样的话微信接收不到…… </p><p>
其实测试号版那个我看完文档之后就在想如果能把内容写到图文消息里也不错啊,可惜图文消息那个要一张头图,做不到开箱即用,这个企业微信版一样也有这个问题…… </p><p>
另外我还看到在文档里有一个文本卡片消息非常的不错但是有一个问题是我不知道为啥它的URL是必选的那这样的话同样我也没办法做到开箱即用…… </p><p>
当然要做的话也不难,自己去看<a href="https://work.weixin.qq.com/api/doc/90000/90135/90236">官方文档</a>就好了,也没有多复杂。 </p><p>
另外测试号版就算模板消息不能用,那也不是不能推送啊,用<a href="https://developers.weixin.qq.com/doc/offiaccount/Message_Management/Batch_Sends_and_Originality_Checks.html">群发预览接口</a>不好吗虽然有每天100次的限制但又不是不能用啊而且还能减少对Server酱服务器的压力我看这所谓要捐助维护就是想着赚钱那么多广告早就够交服务器费用了我也是维护网站的还能不知道这请求要多少钱的服务器 </p><p>
然后看微信发的<a href="https://developers.weixin.qq.com/community/develop/doc/000a4e1df800d82acb9b7fb5e5b001">下线模板消息的通知</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>
<p>其实要不是Server酱有那么多广告还以捐赠名义收费而且还限制那么多的话其实也还算不错的产品而且也是它给了我看微信开发文档的动力让我在假期里还有点事干。只是既然最重要的服务号就要没了那么它也该被开发者们放弃了吧。</p></main>
<small style="display: block">tags: <a rel="category tag" class="p-category" href="/search.html?keyword=Server"><em>Server</em></a> - <a rel="category tag" class="p-category" href="/search.html?keyword=PHP"><em>PHP</em></a> - <a rel="category tag" class="p-category" href="/search.html?keyword=%E5%BE%AE%E4%BF%A1"><em>微信</em></a> <span style="float: right;"><a href="https://gitlab.com/mayx/mayx.gitlab.io/tree/master/_posts/2021-02-26-serverchancorp.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/26/serverchancorp.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/23/picbotpro.html">
上一篇:快速自制微信图片机器人
</a>
</span>
<br />
<span class="next">
<a href="/2021/02/28/discuz.html">
下一篇如何给DiscuzX添加像原生一样的404页面
</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/26/serverchancorp', // 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/26/serverchancorp.html" />
<label for="load_this">
<span style="font-size: 11px; color: #fff;">&#160;想问这篇文章</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>

321
2021/02/28/discuz.html Normal file
View File

@@ -0,0 +1,321 @@
<!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>如何给DiscuzX添加像原生一样的404页面 | Mayx的博客</title>
<meta name="generator" content="Jekyll v3.9.5" />
<meta property="og:title" content="如何给DiscuzX添加像原生一样的404页面" />
<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-28T00:00:00+08:00" />
<meta name="twitter:card" content="summary" />
<meta property="twitter:title" content="如何给DiscuzX添加像原生一样的404页面" />
<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-28T00:00:00+08:00","datePublished":"2021-02-28T00:00:00+08:00","description":"简单的提高用户体验","headline":"如何给DiscuzX添加像原生一样的404页面","mainEntityOfPage":{"@type":"WebPage","@id":"/2021/02/28/discuz.html"},"publisher":{"@type":"Organization","logo":{"@type":"ImageObject","url":"https://avatars0.githubusercontent.com/u/17966333"},"name":"mayx"},"url":"/2021/02/28/discuz.html"}</script>
<!-- End Jekyll SEO tag -->
<link rel="canonical" href="https://mabbs.github.io/2021/02/28/discuz.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.." />&#160;<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-28T00:00:00+08:00">28 February 2021</time> - 字数统计1055 - 阅读大约需要4分钟 - Hits: <span id="/2021/02/28/discuz.html" class="visitors">Loading...</span></small>
<h1 class="p-name">如何给DiscuzX添加像原生一样的404页面</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("Sun, 28 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">这篇文章介绍了如何为DiscuzX论坛添加一个与网站风格匹配且现代化的404页面以提升用户体验。作者通过调用DiscuzX程序自定义生成一个404.php文件设置为服务器错误页面如Nginx的error_page指令使错误请求可以由DiscuzX处理显示更友好的提示信息。作者还自嘲可能是第一个处理这种问题的论坛开发者。</p>
<hr />
<ul><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>像现在的新网站,由于使用的引擎越来越先进,网站的路径看起来非常的不错,那些一般开发的时候把它叫做路由。 </p><p>
而过去的网站不一样以前的网站程序大多都是以文件形式存在访问的时候都是服务器程序去读取相对应的文件。像PHP算是有点年头了尤其像我这种不喜欢用框架就喜欢原生PHP的人更是如此。 </p><p>
但是以前也是有让访问的URL变得花里胡哨的办法的一般我们把那个叫做伪静态那个一般是由服务器程序根据规则把对应的路径重写成文件的物理地址。 </p><p>
不过也有不少引擎会把所有情况的路径重写到一个文件中,再由一个文件慢慢处理,其实这个已经算是路由了,像我之前写的<a href="/2021/01/06/proxy.html">超简单反代</a>就是这样的包括一些博客引擎比如WordPress、Typecho等等还有一些CMS也支持。 </p><p>
然而很遗憾的是DiscuzX作为一款有年代的论坛引擎它不会接收所有的请求到处理程序中去这就导致了一个问题那就是错误的请求不会由DiscuzX处理而是由服务器程序处理。 </p><p>
所以DiscuzX在遇到路径404的问题时就只是白底黑字大大的写着404 Not Found而已很丑一般的处理方法也不过是自己单独整一个404页面显得和网站风格很不匹配。 </p><p>
所以今天我要解决这个问题,让这种有年代的程序也显得稍微现代化一点点。</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>其实解决这个问题很简单调用DiscuzX的程序去生成这个页面就行了所以以下就是生成这个页面的代码因为是看着模板变量随便写的可能有多余的代码但反正能用</p>
<div class="language-php highlighter-rouge"><div class="highlight"><pre class="highlight"><code><span class="cp">&lt;?php</span>
<span class="nb">define</span><span class="p">(</span><span class="s1">'CURSCRIPT'</span><span class="p">,</span> <span class="s1">'404'</span><span class="p">);</span>
<span class="k">require</span> <span class="s1">'./source/class/class_core.php'</span><span class="p">;</span>
<span class="nc">C</span><span class="o">::</span><span class="nf">app</span><span class="p">()</span><span class="o">-&gt;</span><span class="nf">init</span><span class="p">();</span>
<span class="nv">$navtitle</span> <span class="o">=</span> <span class="s2">"提示信息"</span><span class="p">;</span>
<span class="nv">$show_message</span> <span class="o">=</span> <span class="s2">"抱歉,您访问的页面不存在"</span><span class="p">;</span>
<span class="nv">$alerttype</span> <span class="o">=</span> <span class="s1">'alert_error'</span><span class="p">;</span>
<span class="nv">$allowreturn</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
<span class="nv">$param</span><span class="p">[</span><span class="s1">'msgtype'</span><span class="p">]</span> <span class="o">=</span> <span class="mi">1</span><span class="p">;</span>
<span class="k">include</span> <span class="nf">template</span><span class="p">(</span><span class="s1">'common/showmessage'</span><span class="p">);</span>
</code></pre></div></div>
<p>把这个文件保存为404.php然后放到网站根目录就行了然后再把服务器配置里的错误页面设置为这个文件像Nginx的话可以在server段里加一句<code class="language-plaintext highlighter-rouge">error_page 404 /404.php;</code>就OK了。</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>目前来看好像我见到的几乎所有论坛即使不是DiscuzX都没能做到404页面和网站完美融合也许我是第一个写这种东西的人吗😀这样就能很简单的提高特别情况下的网站体验了吧……</p></main>
<small style="display: block">tags: <a rel="category tag" class="p-category" href="/search.html?keyword=PHP"><em>PHP</em></a> - <a rel="category tag" class="p-category" href="/search.html?keyword=DiscuzX"><em>DiscuzX</em></a> <span style="float: right;"><a href="https://gitlab.com/mayx/mayx.gitlab.io/tree/master/_posts/2021-02-28-discuz.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/28/discuz.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/26/serverchancorp.html">
上一篇做一个Server酱·TurboMini企业应用版
</a>
</span>
<br />
<span class="next">
<a href="/2021/03/02/workers.html">
下一篇使用CloudFlare Workers做一些有趣的功能
</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/28/discuz', // 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/28/discuz.html" />
<label for="load_this">
<span style="font-size: 11px; color: #fff;">&#160;想问这篇文章</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>