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


(Ares X) #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-china.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-china.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中文社区


(Ares X) #2

文中os.system函数会导致远程命令执行漏洞,建议用api代替


(Shuai Zend) #3

有想法做个小程序端么.也不知道谁做过