关于使用Discourse的Webhook和QQbot实现论坛动态推送的记录


#1

想弄这个功能想了好几个月,之前到处在找支持rss的qqbot,qq这个东西真的垃圾。。。要给Telegram写bot要简单的多,而且更稳定

配置webhook

新建一个webhook

勾选想要接收的事件

服务端接json&推送消息

python3代码,用py3运行,不然你会看到亲切的unicode error :neutral_face:

webhook.py

from flask import Flask,request,Response
import json
import os

app = Flask(__name__)


@app.route('/')
def hello_world():
    return 'hello world'


@app.route('/json',methods = ['POST'])
def my_json():
    print (request.headers)
    print (request.json)
    print ('\n \n')
    headers = request.headers
   # 用headers中的`X-Discourse-Event`来判断事件类别
    event = (headers['X-Discourse-Event'])
    content = request.json
    res={'msg':handle(event,content)}
    return Response(json.dumps(res),mimetype='application/json')



def new_topic(topic):
    content = topic
    topicName = str(content['topic']['title'])
    topicSlug = str(content['topic']['slug'])
    topicId = str(content['topic']['id'])
    userName = str(content['topic']['details']['created_by']['username'])
    url = 'https://parrotsec-cn.org/t/' + topicSlug + '/' + topicId
    print ('%s 发表了新主题: "%s" \n %s'%(userName,topicName,url))
   #qq bot 推送
    os.system(r'qq send group :like:parrot "%s 发表了新主题: \"%s\" \n %s"'%(userName,topicName,url))
    return ('%s 发表了新主题: "%s" \n %s'%(userName,topicName,url))


def new_post(post):
    content = post
    name = str(content['post']['name'])
    title = str(content['post']['topic_title'])
    topicSlug = str(content['post']['topic_slug'])
    topicId = str(content['post']['topic_id'])
    postNumber = str(content['post']['post_number'])
    url = 'https://parrotsec-cn.org/t/' + topicSlug + '/' + topicId + '/' + postNumber
    if 'reply_to_user' in content['post']:
        postTo = str(content['post']['reply_to_user']['username'])
        print ('%s 在主题 "%s" 中回复了 %s \n %s'%(name,title,postTo,url))
        os.system(r'qq send group :like:parrot "%s 在主题 \"%s\" 中回复了 %s \n %s"'%(name,title,postTo,url))
        return '%s 在主题 "%s" 中回复了 %s \n %s'%(name,title,postTo,url)
    else:
        print ('%s 在主题 "%s" 中发表了回复 \n %s'% (name,title,url))
        os.system(r'qq send group :like:parrot "%s 在主题 \"%s\" 中发表了回复 \n %s"'% (name,title,url))
        return ('%s 在主题 "%s" 中发表了回复 \n %s'% (name,title,url))

# 处理json

def handle(event,myjson):
    if event == 'topic_created':
         # user_id=-1的是system用户
        if myjson['topic']['user_id']==-1:
            pass
        else:
            return new_topic(myjson)
    elif event == 'post_created':
        #每新建一个主题的同时也会发一个新回复的json,区别在于新主题的new_post json中post_number=1,新回复要比1大
        if myjson['post']['post_number'] > 1:
            return new_post(myjson)
    else:
        pass


if __name__ == '__main__':
    app.run(host = '0.0.0.0',port = 8000,debug = True)
  • 注意三个os.system函数中的内容 :like:parrot 是因为有空格的名字好像识别不了。。

代码东拼西凑凑出来的。。写的很烂,欢迎大佬指点那些ugly的地方。。


qq-bot

安装:

pip install qqbot

运行获取配置文件:

qqbot

编辑配置文件:

vim ~/.qqbot-tmp/v2.x.conf

按官方文档要求配置,能登陆就好

运行:

qqbot
python3 webhook.py 

效果

新主题
image

新回复
image

有问题欢迎留言讨论


*转载请注明来自ParrotSec中文社区


使用酷Q机器人实现Discourse论坛动态推送
用Discourse的Webhook和qqbot实现了论坛动态推送qq群
#2

像之前的ircqq,一段时间收不到消息会认为出错然后重新登陆

[2018-02-14 08:51:17] [INFO] 登录成功。登录账号:金刚奥特曼大鹦鹉(2568693308)
[2018-02-14 08:51:17] [INFO] 登录 cookie 尚未过期
[2018-02-14 08:52:17] [ERROR] 接收消息出错,开始测试登录 cookie 是否过期...
[2018-02-14 08:52:17] [INFO] 登录成功。登录账号:金刚奥特曼大鹦鹉(2568693308)
[2018-02-14 08:52:17] [INFO] 登录 cookie 尚未过期
[2018-02-14 08:53:17] [ERROR] 接收消息出错,开始测试登录 cookie 是否过期...
[2018-02-14 08:53:17] [INFO] 登录成功。登录账号:金刚奥特曼大鹦鹉(2568693308)
[2018-02-14 08:53:17] [INFO] 登录 cookie 尚未过期
[2018-02-14 08:54:17] [ERROR] 接收消息出错,开始测试登录 cookie 是否过期...
[2018-02-14 08:54:17] [INFO] 登录成功。登录账号:金刚奥特曼大鹦鹉(2568693308)
[2018-02-14 08:54:17] [INFO] 登录 cookie 尚未过期

为了避免这个问题采取了一种很粗暴的方法。。新建一个定时任务每间隔30秒向一个地方发送消息

让后那个接收消息出错就再没出现过了

有点像ssh发心跳包。。


#3

发现这个方法并不可行。。。一段时间之后消息发不出去了。。。


#4

所以这是失败了吗


#5

不用管它貌似也没事…先看看多久会出问题


#6

存在远程命令执行漏洞。。。现在换成api了。。顺便测试一下api。。


#8

总有刁民想玩鸟


#9

哈哈,interesting


#10

:roll_eyes:
鸟命不久矣…


#11

腾讯的锅…我怕mojo QQ活不了多长时间。。毕竟现在腾讯又是加密又是什么的。。。


#12

我换酷q做机器人了,据说酷q是基于安卓qq协议的,省的天天扫码了。。


#13

酷q不是易语言写的吗?wine能跑?。。。。


#14

封装进了docker https://cqp.cc/t/34558 web连接vnc。。感觉还行


#15

我挺发愁wine跑那易语言写的东西的


Partners Wiki IRC