能帮我创建appid个APPID么?谢谢

请问有人可以提供一个搭建在openshift(或者其他免费云平台)上的一个监测gae appid是否超出配额的源代码么?(供公共goagent服务端使用) - V2EX
V2EX = way to explore
V2EX 是一个关于分享和探索的地方
已注册用户请 &
Sponsored by
100offer 程序员拍卖,让不缺工作机会的优秀程序员,安全匿名的在 2 天内收到 5-10 个优质面试机会,从而拥有一份激(shou)动(ru)人(geng)心(gao)的事业。
Promoted by
请问有人可以提供一个搭建在openshift(或者其他免费云平台)上的一个监测gae appid是否超出配额的源代码么?(供公共goagent服务端使用)
17:28:15 +08:00用 Android 发布 · 4928 次点击
一样,或者
,为goagent提供一个还有多少公共流量的网页,最好还能提供一个如同
的Appid可用列表文件。本人很穷,弄不起vps,只能使用免费云服务,Appid列表在 真的很需要,求有能力之人帮助谢谢,谢谢
60 回复 &| &直到
14:14:25 +08:00
& & 17:48:58 +08:00 via Android
@ 可以帮忙看看么
& & 17:51:35 +08:00 via Android
同样寻找中
& & 18:34:08 +08:00
可以用抓取&appid&./2 的网页信息.如果返回Over Quota,说明这个APPID的流量已经用完了.这个用python写,不难,甚至直接shell语言就行..具体的方法谷歌一下就行.最近python的爬虫好火..
& & 21:33:12 +08:00 via Android
@ 求帮忙编写,最好可以在openshift上运行,我的程序总是出错,给我自己一怒之下删除了=_=
帮帮忙吧,thanks
放在github上托管源代码如何?
& & 21:38:18 +08:00 via Android
@ 用shell是可以,但是python的代码就是搞不定,帮帮忙,实在没有vps折腾
& & 21:43:08 +08:00 via Android
@ 因为gae要考虑流量重置的问题,涉及到系统时间,而且爬390个服务端,速度确实不太可靠………
& & 21:43:29 +08:00
@ 我有意做这个事情,不过想在 BAE 上试下。正在尝试 :D
& & 21:47:16 +08:00 via Android
看了一下网上文档,关于python爬虫的内容还是太少,也没有找到比较好的openshift上运行python的文档,所以更想找现成的,方便又使用,自己的水平确实不够,需要充电
& & 21:48:35 +08:00 via Android
@ 那是相当好的,我没有bae使用资格呀……………
& & 21:50:10 +08:00 via Android
@ 不过bae对gae的访问并不友好毕竟是在墙内,容易问题多多呀
& & 07:12:12 +08:00 via Android
@ 需要VPS应该可以找madeye,估计他有好多,我也有一个,你可以开个捐助页面,现在VPS都不贵,小内存的也就15刀一年。
& & 07:47:42 +08:00
看着难度不大,就是比较折腾吧
& & 10:06:02 +08:00 via Android
@ BAE的话,我个人感觉不是很靠谱,毕竟在国内。其实在openshift上搭建,可以考虑用PHP。Python在那上面感觉还不如在heroku上跑得舒服
& & 20:35:23 +08:00 via Android
@ 那可以找一个人帮忙代工一下么?本人是一个bug狂,经验不足,也想找几个小代码学习学习,多看看大神的代码才能有所长进呀
& & 22:06:14 +08:00
@ 话说手上也没有超出流量的APPID.不好测试
& & 00:01:02 +08:00
&显示 Gist 代码&
按照这个改.用for语句可以批量抓取你的APPID的信息
& & 06:02:47 +08:00 via Android
更新一下地址:
& & 06:09:49 +08:00 via Android
@ 然后用urlib2下载
用 ConfigParser 处理一下应该就可以获得Appid最新列表了吧
& & 06:12:09 +08:00 via Android
@ 非常感谢,问一下,这个程序如果使用gevent编写会出现线程安全问题么
& & 06:15:40 +08:00 via Android
@ 最后一个小问题,怎么才能在openshift上运行呢?需要编写什么东东引导它?网上关于openshift与python的资料也太少了……
& & 06:18:20 +08:00 via Android
@ 突然想起来,如果google认为我是机器人操作,出现sorry页面该怎么处理?openshift的出口ip是动态的么?那样就不怕了
& & 06:21:44 +08:00 via Android
@ 看来如果是使用gevent的话需要将列表拆分5份,用5线程运行可能比较靠谱
& & 07:24:40 +08:00 via Android
@ 一般不会管机器人的,实在不行就伪装浏览器吧,我再搞搞,看看能不能抓多个APPID
& & 07:41:14 +08:00
@ gevent的东西我不太会.不好意思...
& & 13:28:53 +08:00
楼主,我帮你来写吧。我之前用 GAE 写过一个用到了 Cronjob,任务队列 的新闻爬虫,相信你的需求是在我的能力范围内的。
可以考虑邮件联系吗?? alsotang[。
最好能把需要的步骤说清楚点~放在 GAE 或者 Heroku 我应该都能搞定。
& & 13:30:42 +08:00
@ 用不着 gevent 或者线程之类的东西,因为你要获取的这个数据对于『实时性』并没有什么要求,所以用任务队列就好了。
我在 GAE 上跑的爬虫,一秒内可以同时抓取 50 个页面,而且至今还没被认为是 abuse。
& & 13:37:25 +08:00
我看了看你的帖子,貌似明白你的意思了,你看我理解得对不对:
1. 你提供一个搭建了 GoAgent 的 Appid 列表:/p/wwqgtxx-goagent/source/browse/Appid.txt
2. 我写个程序去监控其中那些的流量用完了
3. 我提供个 API 给你,这个 API 可以获取到目前仍然可用的 Appid 列表
是这样??
& & 13:49:43 +08:00 via Android
@ 那谢谢你了,确实如你所说,列表地址在18楼,具体的晚上九点我我们再聊可以么?要上班了
& & 13:52:24 +08:00 via Android
@ 对了还有要统计当前所用流量和每日流量重置之前所消耗的流量
好了,我上班去了。
再次感谢你
& & 13:54:44 +08:00
@ 嗯嗯,晚上聊。18 楼的那个地址有 SSL 错误打不开,我暂时先用这个地址先啦:
& & 13:55:25 +08:00
@ 交给我吧。
& & 15:55:00 +08:00
楼主。大家都是程序员,我就不多说废话了,README.md 里面有详细说明。如果有需要添加的功能或者需要改进的,just send a email to me ~
& & 16:09:11 +08:00
大家看还有什么功能要加的,告诉我一声哈~
& & 17:21:03 +08:00
@ 可以在available APPID上用&|&隔开每个APPID,这样方便获取并生成config文件..
& & 17:30:23 +08:00
@ JSON 已经很好处理了嘛...作为 API,还是希望能提供通用的格式....
& & 20:36:39 +08:00 via Android
@ 加上|分隔的功能吧,同时也提供json作为api也不错。
那个地址可以在墙外使用http打开,即
,另外貌似python可以关闭ssl证书验证………
& & 20:47:29 +08:00 via Android
有了api事情就好办多了,可以生成网页和只有
[gae]
appid = ...
形式的ini么?
这样就不用在本地解析了…………
好吧,我太**了,也可以提供在本地解析的方法,方便更多人搭建
& & 20:52:03 +08:00
@ 解析??我没理解你说的意思?
and 既然 JSON 都有了.....楼主你就真的舍不得自己写一句
'|'.join(appid_list)
& & 20:56:54 +08:00 via Android
@ 想到另一个问题,你估计gae的免费应用运行这个大概可以提供多少的访问量?我要不要试试部署多套应用防止监控程序本身503?
& & 21:07:23 +08:00
Python 2.7.4 (default, May 13 :46)
[GCC 4.2.1 Compatible Apple LLVM 4.2 (clang-425.0.24)] on darwin
Type &help&, &copyright&, &credits& or &license& for more information.
&&& 1 * 1000 * 1000 * 1000 / 847
1180637
&&& 1 * 1000 * 1000 * 1000 / 6000
166666
GAE 每天提供 1G 的流量,/api/wwqgtxx-goagent 这个页面 gzip 后的大小是 847 bytes,那么 GAE 可以供访问 1_180_637 次;不 gzip 的话,这个页面可以被访问 166_666 次。
如果用户每五分钟访问页面一次,那么一个用户一天访问 288 次。
&&& 166666 / 288
578
那么你可以支撑 578 个用户。
如果用户每 20 分钟访问一次,那么你可以支撑 2312 个用户。
你觉得够不够??我只是估算了一下数据而已。
& & 21:14:52 +08:00
@ and 这个程序本身是不会挂的,我算过,按5分钟的频率来计算你的集群健康度的话,它每天跑不完配额。如果之后你的集群增加了,导致这个程序的配额不够用的话,我优化一下就好了的。
and 我已经邀请
成为这个 GAE id 的共同开发者了,你可以去后台看看这个程序的配额信息,如果觉得这个程序有可能 503 的话,告诉我一声就好~
& & 21:18:55 +08:00 via Android
@ 欧,我是说可以方便一下其他不会使用python的小白
刚才申请Appid中,没看到你的回复
& & 21:21:34 +08:00 via Android
@ 好的,我去看看邮箱,最好加上我的主邮箱为develop,我很少登陆1那个邮箱
& & 21:24:10 +08:00
@ 老兄,我们不在这里版聊了好吗。。。我邮箱是
我不知道你的主邮箱是哪个。。。。
& & 21:24:55 +08:00 via Android
@ 有一些奇葩,我的1那个邮箱居然登陆不上,奇葩,看来只能使用主邮箱了
& & 21:30:06 +08:00 via Android
@ 已经发邮件给你,手机上v2ex比Gmail好用…………
& & 19:38:53 +08:00 via Android
………………………………………………………
& & 09:49:23 +08:00 via Android
& & 18:27:39 +08:00
@ BAE上可能性特别低,都会出现错误。话说你做这个有什么用。。。
& & 21:37:21 +08:00 via Android
@ 我换马甲了
& & 10:14:26 +08:00
加强了一下,有页面输出了,大家可以看看
& & 10:17:56 +08:00
@ 有办法移植到openshift么?其实只需要一个后台服务隔15分钟获取一下
即可,剩下直接调用缓存数据即可。
& & 13:42:51 +08:00
@ openshift自己建一个PHP的应用,添加cron的addon
& & 16:18:07 +08:00
@ GAE 的应用移植起来需要一定的功夫...最近没有那个兴趣弄啊。不过我猜你应该也已经看懂我的代码了吧??自己动动手呗~
& & 18:05:58 +08:00 via Android
@ 对php小白一个,实在是不懂
@ 你代码写的那么好,当然改起来很容易,就是那个页面在移动平台上显示不正常,进度条异常的短。
我在大幅度增加appid,现在到689个了,就是不知道为什么统计的时候总会会出现
今日还剩 677GB/689GB 流量
其实
C_over_quota&: [&wwqgtxxproxy-2&, &wwqgtxxproxy-1&]}
可以看看什么原因么
& & 18:10:34 +08:00 via Android
@ 另外我把运行频率调为15分钟一次了,这下不会超过Task Queues限制了,应该这样还是对的吧
& & 09:10:26 +08:00
@ 看到GAE后台输出这个错误
DeadlineExceededError: Deadline exceeded while waiting for HTTP response from URL:
怎么解决?
& & 12:27:25 +08:00
1. 流量显示错误的问题,我建议你自己 debug吧...
2. 频率越高,可以检测的 appid 就越多,这个地方受到 GAE 的配额限制,你可以在 GAE 的后台那里算出你平均每小时使用的配额,然后进行调整就好了。
3. 超时错误,不是问题,忽略就好了。
& & 14:13:25 +08:00 via iPhone
@ 我就是这样计算的。
流量显示错误真的搞不定。
那个error已经通过try catch搞定了
& & 17:35:42 +08:00 via Android
@ 搞定邮件提醒功能了。
问一下,谷歌所在的时区是?
我用洛杉矶时间的,但貌似不对23:00的任务在北京时间的14:00执行了,难道是夏令时?
& · & 1051 人在线 & 最高记录 1307 & · &
创意工作者们的社区
Lovingly made by OLIVIDA
VERSION: 3.9.0 · 56ms · UTC 08:30 · PVG 16:30 · LAX 01:30 · JFK 04:30? Do have faith in what you're doing.谁可以帮我创建个苹果appID么.谢谢_百度知道
谁可以帮我创建个苹果appID么.谢谢
我弄不明白了,谁可以帮我弄一个么,谢谢
我有更好的答案
用户名要什么请采纳答案,支持我一下。
用户名要什么请采纳答案,
其他类似问题
为您推荐:
appid的相关知识
等待您来回答
下载知道APP
随时随地咨询
出门在外也不愁求一个 AppleID 帐号密码 谢谢啊-中国学网-中国IT综合门户网站
> 求一个 AppleID 帐号密码 谢谢啊
求一个 AppleID 帐号密码 谢谢啊
转载 编辑:李强
为了帮助网友解决“求一个 AppleID 帐号密码 谢谢啊”相关的问题,中国学网通过互联网对“求一个 AppleID 帐号密码 谢谢啊”相关的解决方案进行了整理,用户详细问题包括:谢 。 急急急!!,具体解决方案如下:解决方案1:163的,qq的国外有gmail的自己注册一个即可,yahoo的,TOM的,等等,hotmail的。当然如果你没有邮箱的话要先注册一个邮箱国内有126的解决方案2:自己注册一个吧,下载什么东西都需要的呀通过对数据库的索引,我们还为您准备了:答:lD就是你的QQ邮箱号===========================================问:求一个 AppleID 帐号密码 谢谢啊答:苹果商店?===========================================问:以前一个账号丢了。 谢谢谁能在帮我申请个埃 谢谢啦答:APPLE ID 最好自己注册 因为这是很私人的账号,可以通过网银充值也可以绑定信用卡,一旦账号被盗你之前购买过的软件音乐视频就全没有了,个人信息也会泄露,建议自己注册,注册的方法很简单可以参考这里:/article/c146...===========================================问:急需下载用的啊答:★★注册苹果账号苹果中文网:/cn(苹果官网) ①、使用有效可用的电子邮箱作为苹果账号; ②、设置密码的时候必须含有一个大写和一个小写字母; ③、最后完成注册,打开邮箱收到激活邮件,点击激活账号完成。 ④、官网注册最...===========================================问:我想下载个游戏,190 083 197 qq邮箱 谢谢了答:你如果现在已有中国的app账号,是可以更改国家,不用注册新的app账号的。用完可以改回中国,还可以改成美国或者台湾各个国家和地区。 设置→iTunes Store 和 App Store→Apple ID:○○○@○○.com→查看Apple ID→国家或地区→更改国家或地区,接下去应该...===========================================问:我想下载个游戏,190 083 197 qq邮箱 谢谢了答:你可以自己弄一个 用别人的===========================================问:我想下载个游戏,190 083 197 qq邮箱 谢谢了答:/cgi-bin/WebObjects/MyAppleId.woa/wa/createAppleId?localang=zh_CN&appId=2083&returnURL=https%3A%2F%2Fsecure1.%2Fcn%2Fsign_in%3Fc%3DaHR0cDovL3N0b3JlLmFwcGxlLmNvbS9jbnwxYW9zOWVjNTQ1MDk2OWU2...===========================================问:我想下载个游戏,190 083 197 qq邮箱 谢谢了答:你可以自己上苹果ID网站注册啊,别人给你注册不安全===========================================问:我的手机是苹果4S答:给你方法,自己注册,找别人帮着注册不安全。如果是用你自己的邮箱找别人帮着注册,那还好;如果连注册的邮箱都不是你自己的,那就非常危险: 1、持有这个邮箱的人可以随时修改密码,之后你就无法再使用这个ID了; 2、如果你用这样的ID关联并开...===========================================这个很简单的 你自己创建一个 现去商店里找一个免费的东西买 然后在买的时候创建帐号 我也是这么创建的===========================================下面,随便找一个免费的应用程序,点击进入,然后点击 免费,这时会弹出要你登录或创建Apple ID的窗口,点击"创建新的Apple ID"按钮,跟着输入你的邮箱地址作为ID。 密码要大小...===========================================给你,自创的共用apple id: 帐号:&& 密码:Asdf1234 望采纳,谢谢。===========================================lulu_ 试试 晚上我在等着 已经给你注册了个免费的账号 密码是123456Aa 注意加分 谢谢!!===========================================在APPstore里更改账户===========================================是的 简单说是同一个帐号,只是不同的appid授权===========================================用户名跟密码都忘了这还真的找不回了~~至少用户名总得记得吧= =,要是帐户里面没有钱那还是重新创建一个吧~===========================================点击itunes store 进去之后找到一个免费软件排行榜,在里面随便点击一个免费软件然后下载,会弹出一个对话框 然后点击创建apple id 然后按照提示注册就行 账号就是你自己的...===========================================自己创建一个=========================================== 哇塞你这不会是翻新机吧===========================================
本文欢迎转载,转载请注明:转载自中国学网: []
用户还关注
可能有帮助本文欢迎转载,转载请注明:转载自中国学网: []
用户还关注
可能有帮助微信公众平台开发教程(五)自定义菜单(含实例源码) - 停留的风 - 博客园
posts - 213, comments - 1104, trackbacks - 5, articles - 27
微信公众平台开发教程(五)自定义菜单
请尊重作者版权,如需转载,请标明出处。
应大家强烈要求,将自定义菜单功能课程提前。
一、概述:
如果只有输入框,可能太简单,感觉像命令行。自定义菜单,给我们提供了很大的灵活性,更符合用户的操作习惯。在一个小小的微信对话页面,可以实现更多的功能。菜单直观明了,不仅能提供事件响应,还支持URL跳转,如果需要的功能比较复杂,我们大可以使用URL跳转,跳转至我们的网页即可。
注意:自定义菜单,只有服务号才有此功能
如何注册,见第一章:
效果如下,
接着我们详细介绍,如何实现自定义菜单?
二、详细步骤:
1、首先获取access_token&
access_token是公众号的全局唯一票据,公众号调用各接口时都需使用access_token。正常情况下access_token有效期为7200秒,重复获取将导致上次获取的access_token失效。
公众号可以使用AppID和AppSecret调用本接口来获取access_token。AppID和AppSecret可在开发模式中获得(需要已经成为开发者,且帐号没有异常状态)。注意调用所有微信接口时均需使用https协议。
接口调用请求说明
http请求方式: GET
参数是否必须说明
grant_type
获取access_token填写client_credential
第三方用户唯一凭证
第三方用户唯一凭证密钥,既appsecret
正常情况下,微信会返回下述JSON数据包给公众号:
{"access_token":"ACCESS_TOKEN","expires_in":7200}
access_token
获取到的凭证
expires_in
凭证有效时间,单位:秒
错误时微信会返回错误码等信息,JSON数据包示例如下(该示例为AppID无效错误):
{"errcode":40013,"errmsg":"invalid appid"}&
2、创建自定义菜单
自定义菜单能够帮助公众号丰富界面,让用户更好更快地理解公众号的功能。开启自定义菜单后,公众号界面如图所示:
目前自定义菜单最多包括3个一级菜单,每个一级菜单最多包含5个二级菜单。一级菜单最多4个汉字,二级菜单最多7个汉字,多出来的部分将会以&...&代替。请注意,创建自定义菜单后,由于微信客户端缓存,需要24小时微信客户端才会展现出来。建议测试时可以尝试取消关注公众账号后再次关注,则可以看到创建后的效果。
目前自定义菜单接口可实现两种类型按钮,如下:
用户点击click类型按钮后,微信服务器会通过消息接口推送消息类型为event 的结构给开发者(参考消息接口指南),并且带上按钮中开发者填写的key值,开发者可以通过自定义的key值与用户进行交互;
用户点击view类型按钮后,微信客户端将会打开开发者在按钮中填写的url值 (即网页链接),达到打开网页的目的,建议与网页授权获取用户基本信息接口结合,获得用户的登入个人信息。
接口调用请求说明
http请求方式:POST(请使用https协议)&
"button":[
"type":"click",
"name":"今日歌曲",
"key":"V1001_TODAY_MUSIC"
"type":"click",
"name":"歌手简介",
"key":"V1001_TODAY_SINGER"
"name":"菜单",
"sub_button":[
"type":"view",
"name":"搜索",
"type":"view",
"name":"视频",
"type":"click",
"name":"赞一下我们",
"key":"V1001_GOOD"
参数是否必须说明
一级菜单数组,个数应为1~3个
sub_button
二级菜单数组,个数应为1~5个
菜单的响应动作类型,目前有click、view两种类型
菜单标题,不超过16个字节,子菜单不超过40个字节
click类型必须
菜单KEY值,用于消息接口推送,不超过128字节
view类型必须
网页链接,用户点击菜单可打开链接,不超过256字节
正确时的返回JSON数据包如下:
{"errcode":0,"errmsg":"ok"}
错误时的返回JSON数据包如下(示例为无效菜单名长度):
{"errcode":40018,"errmsg":"invalid button name size"}
3、查询菜单
使用接口创建自定义菜单后,开发者还可使用接口查询自定义菜单的结构。
http请求方式:GET
对应创建接口,正确的Json返回结果:
{"menu":{"button":[{"type":"click","name":"今日歌曲","key":"V1001_TODAY_MUSIC","sub_button":[]},{"type":"click","name":"歌手简介","key":"V1001_TODAY_SINGER","sub_button":[]},{"name":"菜单","sub_button":[{"type":"view","name":"搜索","url":"","sub_button":[]},{"type":"view","name":"视频","url":"","sub_button":[]},{"type":"click","name":"赞一下我们","key":"V1001_GOOD","sub_button":[]}]}]}}
4、删除菜单
使用接口创建自定义菜单后,开发者还可使用接口删除当前使用的自定义菜单。
http请求方式:GET
对应创建接口,正确的Json返回结果:
{"errcode":0,"errmsg":"ok"}
5、事件处理
用户点击自定义菜单后,如果菜单按钮设置为click类型,则微信会把此次点击事件推送给开发者,注意view类型(跳转到URL)的菜单点击不会上报。
推送XML数据包示例:
&ToUserName&&![CDATA[toUser]]&&/ToUserName&
&FromUserName&&![CDATA[FromUser]]&&/FromUserName&
&CreateTime&&/CreateTime&
&MsgType&&![CDATA[event]]&&/MsgType&
&Event&&![CDATA[CLICK]]&&/Event&
&EventKey&&![CDATA[EVENTKEY]]&&/EventKey&
参数说明:
ToUserName
开发者微信号
FromUserName
发送方帐号(一个OpenID)
CreateTime
消息创建时间 (整型)
消息类型,event
事件类型,CLICK
事件KEY值,与自定义菜单接口中KEY值对应
三、实例讲解
还接着上一篇文章讲。
我们将在上一篇文章基础上,添加自定义菜单功能。
1、获取access_token
首先需要得到AppId和AppSecret
当你成为开发者后,自然能够在,开发者模式,便可看到这两个值,可以重置。
然后调用按照二.1中所示,进行操作。
注意:access_token有过期时间,如果过期,需要重新获取。
代码如下:
private static DateTime GetAccessToken_T
/// &summary&
/// 过期时间为7200秒
/// &/summary&
private static int Expires_Period = 7200;
/// &summary&
/// &/summary&
private static string mAccessT
/// &summary&
/// &/summary&
public static string AccessToken
//如果为空,或者过期,需要重新获取
if (string.IsNullOrEmpty(mAccessToken) || HasExpired())
mAccessToken = GetAccessToken(AppID, AppSecret);
return mAccessT
/// &summary&
/// &/summary&
/// &param name="appId"&&/param&
/// &param name="appSecret"&&/param&
/// &returns&&/returns&
private static string GetAccessToken(string appId, string appSecret)
string url = string.Format("https://api./cgi-bin/token?grant_type=client_credential&appid={0}&secret={1}", appId, appSecret);
string result = HttpUtility.GetData(url);
XDocument doc = XmlUtility.ParseJson(result, "root");
XElement root = doc.R
if (root != null)
XElement access_token = root.Element("access_token");
if (access_token != null)
GetAccessToken_Time = DateTime.N
if (root.Element("expires_in")!=null)
Expires_Period = int.Parse(root.Element("expires_in").Value);
return access_token.V
GetAccessToken_Time = DateTime.MinV
return null;
/// &summary&
/// 判断Access_token是否过期
/// &/summary&
/// &returns&bool&/returns&
private static bool HasExpired()
if (GetAccessToken_Time != null)
//过期时间,允许有一定的误差,一分钟。获取时间消耗
if (DateTime.Now & GetAccessToken_Time.AddSeconds(Expires_Period).AddSeconds(-60))
return true;
return false;
2、设置菜单
菜单需根据需要,按照实际要求进行设定。
这里我们提供天气查询功能,将常用的城市列出来,点击即可查询。
然后还提供了友情链接,这里提供了view类型的菜单,直接可以跳转至URL页面,为跳转做个好的演示。
具体菜单如下:
"button": [
"name": "链接",
"sub_button": [
"type": "view",
"name": "搜索",
"url": "/"
"type": "view",
"name": "视频",
"url": "/"
"type": "click",
"name": "赞一下我们",
"key": "BTN_GOOD"
"name": "查询天气",
"sub_button": [
"type": "click",
"name": "武汉",
"key": "BTN_TQ_WUHAN"
"type": "click",
"name": "上海",
"key": "BTN_TQ_SHANGHAI"
"type": "click",
"name": "北京",
"key": "BTN_TQ_BEIJING"
"type": "click",
"name": "帮助",
"key": "BTN_HELP"
3、管理菜单
因为菜单的变更没有那么频繁,因此通过txt文件来设置菜单,并通过管理界面来管理菜单。
主要的管理功能:
1)从文件加载菜单
2)创建菜单。即将菜单通知微信服务端,并更新至微信客户端
3)查询菜单。获取当前系统的菜单。
4)删除菜单。从微信服务器删除菜单,也可以删除后再创建。&
实现代码如下:
public class MenuManager
/// &summary&
/// 菜单文件路径
/// &/summary&
private static readonly string Menu_Data_Path = System.AppDomain.CurrentDomain.BaseDirectory + "/Data/menu.txt";
/// &summary&
/// 获取菜单
/// &/summary&
public static string GetMenu()
string url = string.Format("https://api./cgi-bin/menu/get?access_token={0}", Context.AccessToken);
return HttpUtility.GetData(url);
/// &summary&
/// 创建菜单
/// &/summary&
public static void CreateMenu(string menu)
string url = string.Format("https://api./cgi-bin/menu/create?access_token={0}", Context.AccessToken);
//string menu = FileUtility.Read(Menu_Data_Path);
HttpUtility.SendHttpRequest(url, menu);
/// &summary&
/// 删除菜单
/// &/summary&
public static void DeleteMenu()
string url = string.Format("https://api./cgi-bin/menu/delete?access_token={0}", Context.AccessToken);
HttpUtility.GetData(url);
/// &summary&
/// 加载菜单
/// &/summary&
/// &returns&&/returns&
public static string LoadMenu()
return FileUtility.Read(Menu_Data_Path);
4、基本方法
上面的代码,其实我们对一些公共功能做了封装。如进行get请求、POST提交等操作,读取文件等。
这里我们提供进行get、Post提交的方法案例代码,如果使用,建议优化。
using System.IO;
using System.N
using System.T
using System.W
namespace Yank.WeiXin.Robot.Utility
/// &summary&
/// Http帮助类
/// &/summary&
class HttpUtility
/// &summary&
/// 发送请求
/// &/summary&
/// &param name="url"&Url地址&/param&
/// &param name="data"&数据&/param&
public static string SendHttpRequest(string url, string data)
return SendPostHttpRequest(url,"application/x-www-form-urlencoded",data);
/// &summary&
/// &/summary&
/// &param name="url"&&/param&
/// &returns&&/returns&
public static string GetData(string url)
return SendGetHttpRequest(url,"application/x-www-form-urlencoded");
/// &summary&
/// 发送请求
/// &/summary&
/// &param name="url"&Url地址&/param&
/// &param name="method"&方法(post或get)&/param&
/// &param name="method"&数据类型&/param&
/// &param name="requestData"&数据&/param&
public static string SendPostHttpRequest(string url,string contentType,string requestData)
WebRequest request = (WebRequest)HttpWebRequest.Create(url);
request.Method = "POST";
byte[] postBytes = null;
request.ContentType = contentT
postBytes = Encoding.UTF8.GetBytes(requestData);
request.ContentLength = postBytes.L
using (Stream outstream = request.GetRequestStream())
outstream.Write(postBytes, 0, postBytes.Length);
string result = string.E
using (WebResponse response = request.GetResponse())
if (response != null)
using (Stream stream = response.GetResponseStream())
using (StreamReader reader = new StreamReader(stream, Encoding.UTF8))
result = reader.ReadToEnd();
/// &summary&
/// 发送请求
/// &/summary&
/// &param name="url"&Url地址&/param&
/// &param name="method"&方法(post或get)&/param&
/// &param name="method"&数据类型&/param&
/// &param name="requestData"&数据&/param&
public static string SendGetHttpRequest(string url, string contentType)
WebRequest request = (WebRequest)HttpWebRequest.Create(url);
request.Method = "GET";
request.ContentType = contentT
string result = string.E
using (WebResponse response = request.GetResponse())
if (response != null)
using (Stream stream = response.GetResponseStream())
using (StreamReader reader = new StreamReader(stream, Encoding.UTF8))
result = reader.ReadToEnd();
using System.Xml.L
using Newtonsoft.J
namespace Yank.WeiXin.Robot.Utility
class XmlUtility
/// &summary&
/// &/summary&
/// &param name="json"&&/param&
/// &param name="rootName"&&/param&
/// &returns&&/returns&
public static XDocument ParseJson(string json,string rootName)
return JsonConvert.DeserializeXNode(json, rootName);
5、事件处理
设置了菜单,这下需要处理事件了。跟我们之前设计ASPX或者WinForm一样,都要绑定按钮的事件。这里只是通过XML消息将请求传递过来。
通过&2、设置菜单"中具体的菜单内容,我们便已经知道需要进行哪些事件处理了。对于按钮类型为view的,无须处理,它会自动跳转至指定url.
需要处理的点击事件:
2)查询某城市的天气,北京、上海、武汉
这个还要沿用上章中的事件处理器EventHandler来扩展处理。
具体的实现代码吧:
using System.Collections.G
using System.L
using System.T
using Yank.WeiXin.Robot.M
namespace Yank.WeiXin.Robot.Handlers
class EventHandler : IHandler
/// &summary&
/// 请求的xml
/// &/summary&
private string RequestXml { get; set; }
/// &summary&
/// 构造函数
/// &/summary&
/// &param name="requestXml"&&/param&
public EventHandler(string requestXml)
this.RequestXml = requestX
/// &summary&
/// 处理请求
/// &/summary&
/// &returns&&/returns&
public string HandleRequest()
string response = string.E
EventMessage em = EventMessage.LoadFromXml(RequestXml);
if (em != null)
switch (em.Event.ToLower())
case ("subscribe"):
response = SubscribeEventHandler(em);
case "click":
response = ClickEventHandler(em);
/// &summary&
/// &/summary&
/// &param name="em"&&/param&
/// &returns&&/returns&
private string SubscribeEventHandler(EventMessage em)
//回复欢迎消息
TextMessage tm = new TextMessage();
tm.ToUserName = em.FromUserN
tm.FromUserName = em.ToUserN
tm.CreateTime = Common.GetNowTime();
tm.Content = "欢迎您关注***,我是大哥大,有事就问我,呵呵!\n\n";
return tm.GenerateContent();
/// &summary&
/// 处理点击事件
/// &/summary&
/// &param name="em"&&/param&
/// &returns&&/returns&
private string ClickEventHandler(EventMessage em)
string result = string.E
if (em != null && em.EventKey != null)
switch (em.EventKey.ToUpper())
case "BTN_GOOD":
result = btnGoodClick(em);
case "BTN_TQ_BEIJING":
result = searchWeather("beijing", em);
case "BTN_TQ_SHANGHAI":
result = searchWeather("shanghai", em);
case "BTN_TQ_WUHAN":
result = searchWeather("wuhai", em);
case "BTN_HELP":
result = btnHelpClick(em);
/// &summary&
/// 赞一下
/// &/summary&
/// &param name="em"&&/param&
/// &returns&&/returns&
private string btnGoodClick(EventMessage em)
//回复欢迎消息
TextMessage tm = new TextMessage();
tm.ToUserName = em.FromUserN
tm.FromUserName = em.ToUserN
tm.CreateTime = Common.GetNowTime();
tm.Content = @"谢谢您的支持!";
return tm.GenerateContent();
/// &summary&
/// &/summary&
/// &param name="em"&&/param&
/// &returns&&/returns&
private string btnHelpClick(EventMessage em)
//回复欢迎消息
TextMessage tm = new TextMessage();
tm.ToUserName = em.FromUserN
tm.FromUserName = em.ToUserN
tm.CreateTime = Common.GetNowTime();
tm.Content = @"查询天气,输入tq 城市名称\拼音\首字母";
return tm.GenerateContent();
/// &summary&
/// 查询天气
/// &/summary&
/// &param name="cityName"&&/param&
/// &param name="em"&&/param&
/// &returns&&/returns&
private string searchWeather(string cityName, EventMessage em)
TextMessage tm = new TextMessage();
tm.Content = WeatherHelper.GetWeather(cityName);
//进行发送者、接收者转换
tm.ToUserName = em.FromUserN
tm.FromUserName = em.ToUserN
tm.CreateTime = Common.GetNowTime();
return tm.GenerateContent();
终于大工告成,最后来看下效果图吧
请尊重作者版权,如需转载,请标明出处。
&下一章计划:
微信公众平台开发教程(六)获取个性二维码

我要回帖

更多关于 appid和appsecret 的文章

 

随机推荐