​​​​ 我的微信公众号机器人 | 苏生不惑的博客

我的微信公众号机器人

这是一篇旧文。

最近北京进入高温天气,最高气温 36 度,太热了。

image

最近一朋友创业开发一棋牌游戏,买了台阿里云服务器,帮他做了个后台,想着不能浪费资源,记得之前用我的个人微信玩过微信机器人,于是想着给公众号也接一个机器人,于是就有了这个公众号的机器人,下面开始说说怎么开发的。

第一步当然是注册公众号了,这个简单了,就不说了,然后在基本配置里设置服务器地址和 token,需要注意的是服务器需要能在外网访问,80 端口能访问。如果没有自己的外网服务器,也可以使用开源的 ngrok.com ngrok.cc frp 什么的,我没有测试过,你可以尝试下。

image

机器人是基于图灵的,所以再去 http://www.tuling123.com/ 用手机号注册个账号,申请 key 在 http://www.tuling123.com/member/center/index.jhtml 这个页面可以看到,免费的次数每天 5000,应该够了,功能也比较多全。

image

image

image

下面开始写代码了,我用的是 PHP 比较简单了,才 100 行代码左右,调用也简单。需要注意微信是用 xml 传输的,所以需要转换下。

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
100
101
102
103
104
105
106
107
108
109
110
111
112
113
114
115
116
117
118
119
120
121
122
123
124
125
126
127
128
129
130
131
132
133
134
135
136
137
138
139
140
141
142
143
144
145
146
147
148
149
150
151
152
153
154
155
156
157
158
159
160
161
162
163
164
165
166
167
168
169
170
171
172
173
174
175
176
177
178
179
180
181
182
183
184
185
186
187
188
189
190
191
192
193
194
195
196
197
198
199
200
201
202
203
204
205
1.  `<?php`

2. `define("TOKEN", "mybot");`

3. `$wechatObj = new wechatCallbackapi();`

5. `//验证微信和响应合并`

6. `if (isset($_GET['echostr'])) {`

7. `$wechatObj->valid();`

8. `} else {`

9. `$wechatObj->responseMsg();`

11. `}`

13. `class wechatCallbackapi{`

14. `public function valid(){`

15. `$echoStr = $_GET["echostr"];`

16. `if($this->checkSignature()){`

17. `echo $echoStr;`

18. `exit;`

19. `}`

20. `}`

21. `public function responseMsg(){`

22. `//接受微信服务器发过来的数据`

23. `//$postStr = $GLOBALS["HTTP_RAW_POST_DATA"];`

24. `$postObj = [];`

25. `$postStr = file_get_contents('php://input');`

26. `if (!empty($postStr)){`

27. `$postObj = (array)simplexml_load_string($postStr, 'SimpleXMLElement', LIBXML_NOCDATA);`

28. `}`

29. `switch($postObj['MsgType']){`

30. `case "text":`

31. `$resultStr = $this->handleText($postObj,$userinfo_base['uid'],$link);`

32. `break;`

33. `default:`

34. `$resultStr = "Unknow msg type";`

35. `break;`

36. `}`

37. `echo $resultStr;`

38. `}`

40. `private function handleText($postObj,$uid,$link) {`

41. `$keyword = trim($postObj['Content']);`

42. `$res = file_get_contents('http://www.tuling123.com/openapi/api?key=youkey&info='.urlencode($keyword));// 这里用自己申请的 key`

43. `$contentStr = json_decode($res, 1)['text'];`

44. `$resultStr = $this->responseText($postObj,$contentStr);`

45. `return $resultStr;`

46. `}`

48. `//回复文字信息`

49. `private function responseText($postObj,$contentStr) {`

50. `$toUsername = $postObj['ToUserName'];`

51. `$textTpl = "<xml>`

52. `<ToUserName><![CDATA[%s]]></ToUserName>`

53. `<FromUserName><![CDATA[%s]]></FromUserName>`

54. `<CreateTime>%s</CreateTime>`

55. `<MsgType><![CDATA[%s]]></MsgType>`

56. `<Content><![CDATA[%s]]></Content>`

57. `</xml>";`

58. `$resultStr = sprintf($textTpl,FROMUSERNAME,$toUsername,time(),'text',$contentStr);`

59. `return $resultStr;`

60. `}`

62. `//回复图文信息 这里没有用到`

63. `private function responseNews($postObj,$contentStr) {`

64. `$toUsername = $postObj['ToUserName'];`

65. `$news="<xml>`

66. `<ToUserName><![CDATA[%s]]></ToUserName>`

67. `<FromUserName><![CDATA[%s]]></FromUserName>`

68. `<CreateTime>%s</CreateTime>`

69. `<MsgType><![CDATA[%s]]></MsgType>`

70. `<ArticleCount>%d</ArticleCount>`

71. `<Articles>%s</Articles>`

72. `</xml>";`

73. `$itemTpl = '<item>`

74. `<Title><![CDATA[%s]]></Title>`

75. `<Discription><![CDATA[%s]]></Discription>`

76. `<PicUrl><![CDATA[%s]]></PicUrl>`

77. `<Url><![CDATA[%s]]></Url>`

78. `</item>';`

79. `$items = '';`

80. `foreach ($contentStr as $v) {`

81. `if(is_array($v)){`

82. `//多图文`

83. `$items .= sprintf($itemTpl, $v['Title'], $v['Discription'], $v['PicUrl'], $v['Url']);`

84. `$num = count($contentStr);`

85. `}else {`

86. `//单图文`

87. `$items= sprintf($itemTpl, $contentStr['Title'], $contentStr['Discription'], $contentStr['PicUrl'], $contentStr['Url']);`

88. `$num = 1;`

89. `}`

90. `}`

91. `$resultStr = sprintf($news, FROMUSERNAME, $toUsername, time(), 'news', $num,$items);`

92. `return $resultStr;`

93. `}`

94. `//微信验证`

95. `private function checkSignature(){`

96. `$signature = $_GET["signature"];`

97. `$timestamp = $_GET["timestamp"];`

98. `$nonce = $_GET["nonce"];`

99. `$token = TOKEN;`

100. `$tmpArr = array($token, $timestamp, $nonce);`

101. `sort($tmpArr);`

102. `$tmpStr = implode($tmpArr);`

103. `$tmpStr = sha1($tmpStr);`

104. `if($tmpStr == $signature){`

105. `return true;`

106. `}`

107. `return false;`

108. `}`

109. `}`

看看效果吧,常用关键字:笑话,天气,故事,段子,成语接龙,菜谱,更多玩法开始关注我的公众号玩吧,再也不用担心一个人无聊了。

image

image

太热了,要去洗澡了,bye。