很久之前听到多说要关闭的这个消息内心十分复杂,因为又要花一些时间去转移数据啦~
况且千千的评论还这么多。
评论数量什么的都不重要啦,重要的是关闭插件以后的原生评论框好丑😭
算了,还是等一切都结束以后再做吧!
然后某天看到 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()
这一定是千千发出的有关多说的最后一篇文章啦~
谢谢你陪伴我一年的时间~
久安~
多说有点坑,以前用,有些时间经常抽风。后来很早就不用了。其实最主要还是听说有备份用户文章的后门……一个评论插件搞这么多。是我最无法忍受以至于放弃他的原因( ง ᵒ̌皿ᵒ̌)ง⁼³₌₃
备份用户文章的话插件是可以直接访问数据库的,如果自己写爬虫可以从前台抓取,所以这点我是无所谓咯!(反正都可以被别人获取到)
至于为什么要用多说,对我来说可能是那一个圈子吧!不管走到哪里都会有提醒未阅读的消息,还有Ajax流畅的提交方式。
顶顶顶!!!学习了~
哈哈,不过好像过期了欸
一直不喜欢多说,因为作为游客不能填写URL
记得多说好像也可以做到不填写URL然后评论的