多说 UA 写回数据库

很久之前听到多说要关闭的这个消息内心十分复杂,因为又要花一些时间去转移数据啦~

况且千千的评论还这么多。

评论数量什么的都不重要啦,重要的是关闭插件以后的原生评论框好丑😭

算了,还是等一切都结束以后再做吧!

 

然后某天看到 LWL12 写过的 记弃用多说牵扯出来的一堆坑 中有这么一句:

多说的 WordPress 插件众所周知是有一个自动往本地数据库回写的功能的,也是这个功能让不少站长很开心的入了坑。

然而有一个比较坑的地方是,这个回写并不会把正确的 User-Agent 写到本地数据库,而是用一个 Duoshuo/1.2:0000000000000000000 这样的字符串来代替。

所以如果你把多说给撤了,那么不做处理的话这些 UA 数据就是相当于丢了。

 

于是,默默的打开自己的数据库看了看,真的是欸~ (悲伤几分钟)

因为 LWL12 有贴出自己写的代码,然后就放心的把 UA 有关的预计处理时间置零咯~


直到昨天才发现代码中 https://你的多说管理后台前缀.duoshuo.com/api/posts/list.json 已失效,明明还没有到儿童节的说 /(ㄒoㄒ)/~~

{"code":990002,"errorMessage":"很抱歉,多说项目已关闭.请见http:\/\/duoshuo.com"}

 

只能找其他方法咯~

多说也有提供导出数据的功能啦,只是 export.json 中还是没有我想要的 UA 信息。

 

于是,去翻了翻官方文档中的 获取文章的评论

 

然后尝试了一篇自己的文章

发现 parentPosts 中的每一个 id 都代表一条评论,并且每一条评论中的 agent 便是我们需要找的 UA 😝~

回到数据库中又看了看,发现这里的 id 刚好是数据库中 Duoshuo/1.2: 后面的内容。

然后问题便解决啦~

 

贴出自己写的代码,使用的话需要保证你的电脑上要有 Python2.7 的环境哦~

还有别忘了修改代码中前面的几个字段(代码保质期:18天)

# -*- coding:utf-8 -*-

import MySQLdb
import urllib
import json

# 多说短名
short_name = 'short_name'
db_host = "localhost"
db_user = "root"
db_pass = "pass"
db_name = "wordpress"
db_charset = "utf8mb4"
# 表前缀
fi_table = "dw_"

db = MySQLdb.connect(db_host, db_user, db_pass, db_name)
cursor = db.cursor()
cursor.execute("set names " + db_charset)

work_list = []
fail_list = []


# 从 json 数据中获取评论的 agent 信息
def get_ua(js, agent):
    try:
        # print js
        if len(js['parentPosts']) > 0:
            comment = js['parentPosts'][agent]
            print comment['author']['name'], comment['message']
            return comment['agent']
    except KeyError:
        pass
    return ''


# 根据多说短名与文章 id 获取当前文章所有评论信息
def get_json(thread_id):
    global short_name
    url = 'http://api.duoshuo.com/threads/listPosts.json?thread_key=' + str(
        thread_id) + '&short_name=' + short_name + '&page=1&limit=1000'
    print url
    html = urllib.urlopen(url).read()
    return json.loads(html)


def get_data(post_id):
    global cursor
    sql = "select * from " + fi_table + "comments where comment_agent like 'Duoshuo%' and comment_post_ID = " + str(
        post_id)
    cursor.execute(sql)
    return cursor.fetchall()


# 将找到的ua信息写回数据库
def update_data(comment_id, ua_info):
    global db, cursor
    if ua_info == '':
        fail_list.append(comment_id)
        return
    sql = "update " + fi_table + "comments set comment_agent = '" + ua_info + "' where comment_ID = " + str(comment_id)
    print sql
    try:
        cursor.execute(sql)
        db.commit()
    except:
        db.rollback()


# 获取需要修改的评论文章所在ID
def get_work_list():
    global cursor, work_list
    sql = "SELECT DISTINCT comment_post_ID from " + fi_table + "comments where comment_agent like 'Duoshuo%'"
    cursor.execute(sql)
    data = cursor.fetchall()
    for i in data:
        work_list.append(i[0])


get_work_list()
for i in work_list:
    js = get_json(i)
    data = get_data(i)
    for i in data:
        # 字符串切片 去掉 'duoshuo/1.2:'
        ua_info = get_ua(js, str(i[11])[12:])
        update_data(i[0], ua_info)
# 出错评论 ID
print fail_list
db.close()

这一定是千千发出的有关多说的最后一篇文章啦~

谢谢你陪伴我一年的时间~

久安~


回复 千千 哎呀!还是不要说的啦……

22 只已被捕捉

  • txh Chrome | 50.0.2661.94 Windows 7

    多说有点坑,以前用,有些时间经常抽风。后来很早就不用了。其实最主要还是听说有备份用户文章的后门……一个评论插件搞这么多。是我最无法忍受以至于放弃他的原因( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃

    • 千千 Chrome | 60.0.3107.4 Windows 10/11

      备份用户文章的话插件是可以直接访问数据库的,如果自己写爬虫可以从前台抓取,所以这点我是无所谓咯!(反正都可以被别人获取到)
      至于为什么要用多说,对我来说可能是那一个圈子吧!不管走到哪里都会有提醒未阅读的消息,还有Ajax流畅的提交方式。

  • 跨境电商平台 Mozilla FireFox | 54.0 Windows 10/11

    顶顶顶!!!学习了~

    • 千千 Edge | 15.15063 Windows 10/11

      哈哈,不过好像过期了欸

  • 尹先生 Chrome | 58.0.3029.83 Android 5.1

    一直不喜欢多说,因为作为游客不能填写URL

    • 千千 Edge | 15.15063 Windows 10/11

      记得多说好像也可以做到不填写URL然后评论的