文章
技术

上海市共产党员信息XLSX修复及还原【压缩包下载】

rebecca  ·  2020年8月18日 我不是品葱的神,但是后来发生了一些事情

最近有一个名单在网上传得很火,详情和原文件参见【转载】上海市全体中共党员户籍放送

这个名单是两个xlsx文件,下载后打开,发现内容其实是SQL数据库备份还原文件(以SQL语法撰写),但是被人用Microsoft Excel当成CSV格式打开,再保存为XLSX格式的。

这种做法是有问题的,因为逗号在SQL中并不只是作参数的分隔符,在字符串中间也可能有逗号(原因可能是原始数据输入错误),所以搞出来的这个XLSX文件,每一行的长度是不一样的:

还有一些原因类似的bug:

崩坏成这样的数据,计算机是没法高效检索的。于是我写了一个python脚本,将数据整理成程序员们喜闻乐见的CSV格式,过滤掉原文中的逗号、空格和引号,而且确保每行都是11列:

import re
pat1 = r'\((.*)\);'

def proc(s):
    if s[0]=="'" and s[-1]=="'":
        return s[1:-1]
    elif s=='null':
        return ''
    else:
        print(s)
        raise Exception('nope')

def eat(l):
    l = l.strip()
    # rec = l

    try:
        l = l.replace('\t',',')
        rec = l
        l = l.replace('\\"','\\')
        l = l.replace('","',',')

        m = re.search(pat1,l)
        if not m:
            return False

        l = m[1]

        l = l.replace('null', "'null'")

        l = eval(l)
        # print(l)

        l = [i.replace(',','').replace("'",'').replace('"','').replace('$','').strip() if i else i for i in l]

        assert len(l)==11

    except Exception as e:
        print(rec)
        raise e

    return l

files = '1.txt','2.txt'
# save from xlsx to unicode-txt in microsoft excel 2010
# should be in utf-16 encoding

result = open('result.txt','w',encoding='utf-8')

for fn in files:
    with open(fn,'r', encoding='utf-16') as f:
        while 1:
            l = f.readline()
            if l:
                tup = eat(l)
                if tup:
                    result.write(','.join(tup) + '\n')
            else:
                break

运行上面这个脚本前,请先把两个xlsx文件用Excel2010打开,然后保存为Unicode文本文件(txt),分别命名为 1.txt 和 2.txt

运行脚本后会得到result.txt,内容预览如下:

1,陶凌霞,女,汉族,上海,中共黄浦区委宣传部机关支部委员会,310110198305082041,松花江路1160弄24号601室,13795206049,null,硕士研究生
2,吕清逸,男,汉族,上海,黄浦区审计局机关党支部,310102195310292031,null,13621647402,null,大学
3,姚茂华,男,汉族,上海,中共黄浦区人民政府办公室第三支部委员会,310103192904081218,null,null,null,普通高中
4,王海玲,女,汉族,上海,黄浦区人民法院行装科党支部,310108197401092446,null,null,null,大学
5,杨敷敦,男,汉族,江苏太仓,黄浦区科委第二党支部,310102194212200039,null,null,null,大专
6,许晶彦,男,汉族,上海,中共黄浦区规划和土地管理局机关在职党支部委员会,310103197601282410,昌里东路395弄50号201室,13601621253,null,大学
7,钱华安,男,汉族,上海,中共黄浦区商务委机关第二支部委员会,310109196508156819,null,null,null,大学
8,宋维福,男,汉族,上海,黄浦区民防办机关支部,310110196309098615,null,null,null,大学
9,王雯,女,汉族,浙江,中共黄浦区环境保护局机关支部,310109196707306824,null,null,null,大学
10,周健强,男,汉族,上海,中共黄浦区规划和土地管理局机关在职党支部委员会,420106197310134412,null,null,null,大学
11,杨海霞,女,汉族,上海,中共黄浦区委宣传部新闻中心支部委员会,310101197711102844,null,null,null,大学
12,张英,女,汉族,上海,中共黄浦区妇女联合会第二支部委员会,31010919240516042X,null,null,null,普通高中
13,张培琳,女,汉族,上海,中共黄浦区委组织部机关退休支部委员会,310103195412071666,null,null,null,大学

文件格式为CSV,编码为utf-8,大小为264093KB,7z压缩之后为43361KB。

压缩包链接(Telegram):https://t.me/ccplist/2

菜单
  1. mountainsea   发完10个帖子,账号保持静默。账号是隔壁佛学院共用的,写的东西跟我无关,请领导不要上山下海找我。

    补充一下信息:这个文件是16年就发过的;资料是真实的;有一些人已经去世了。

  2. rebecca   我不是品葱的神,但是后来发生了一些事情

    @mountainsea 记得。

    你要求的匿名是什么意思,是不登录的情况下发表信息吗?还是所谓的前台匿名?

  3. thphd   2047前站长

    但是我本人更倾向于隐秘,使用一次性账号

    帮我想一个,能让路人生成一堆匿名账号,又能避免spam的方式。

    你自己可以给自己发邀请码,但是邀请码在数据库是有记录的,可能不是很符合你的口味。

  4. mountainsea   发完10个帖子,账号保持静默。账号是隔壁佛学院共用的,写的东西跟我无关,请领导不要上山下海找我。

    给自己发邀请码,就像你说的有两个问题:如果数据库没有记录,那么邀请码制度名存实亡(一只mole就可以引入万千水军);如果数据库记录而且可查询,那么新账号和老账号之间还是直接联系,做不到匿名(就算加密数据库记录,但是这种长期记录和历史记录被解密以后还是有问题)。

    关于anti-spam的东西,没有什么新意,但是现有的工具这两个链接写得不错:

    https://wordpress.stackexchange.com/questions/54465/allow-anonymous-comments-but-prevent-spam

    https://wpforms.com/how-to-build-spam-free-wordpress-contact-forms-the-ultimate-guide/#honeypot

    我记得编程随想也试验过一些,我有点记不清了。

    我自己的想法比较麻烦:1. 系统自动reserve一部分固定的匿名账号(比如,小号海1~小号海9)作为令牌;2. 有需要的用户申请令牌; 3. 在一定规则下(比如,老用户或者是管理信任的用户,或者是其他规则),系统自动同意或者拒绝申请;4. 如果同意申请,那么系统自动random给予申请者一个令牌(比如,小号海5)12小时(或者更短,或者更长),并自动生成一个密码; 在这12小时中,密码有效,12小时之后,密码失效 (如果用户12小时之后还需要匿名令牌,重新申请,并且random给一个新的令牌;之前的老令牌在接下来12小时内不再分配给其他人,原因在接下来的第5点);5. 系统关联记录当前申请者主账号和得到的令牌,暂时储存在“缓存”中加密保存12+12小时(anti abuse:站长可以在这24小时内通过密匙读取,并且对令牌所有者的主账号进行处罚;当然如何确保只保存24小时,如何确保其他人不能读取可以再聊)。

    固定多个匿名账号的原因有二:。首先是之前anti abuse的原因,固定的匿名账号可以短期把发帖人和原作者联系起来;其次同一个令牌可以在不同时段频繁被不同人使用,增加被标注识别的难度。

    当然,这个方法也不是完美的,但是它会极大增加国宝收集training data的麻烦。而且兼顾了anti abuse。

    不过也许你或者其他人能有更好的方法?我抛砖引玉了。

    最后,这些东西能否成,都有一个前期,这个网站人气不错,有匿名需求的人足够多。不然,你的机制再好,没有足够喜欢匿名的人玩,最后还是所有匿名的人都是一个人,那么匿名和不匿名没什么区别了。现在我的需求不重要,你来完善网站,吸引人气更重要。等比较多的人有匿名需求,再考虑不迟。

  5. 穿鞋的企鹅  

    能让路人生成一堆匿名账号,又能避免spam的方式。

    这里最大的问题在于,路人/匿名者发言相比于注册用户发言缺乏accountability和control,所以spam风险高。accountability除非去/减弱匿名化否则没法引入,容易改变的就是control。

    我有一个可能天马行空的想法:路人可以匿名发言,不用注册账号(如发言人统一显示为“匿名者”),但是其所有发言默认为“待处理的spam”,不直接显示(如默认为访客不可见、注册用户要打开折叠才可见状态),且默认一段时间后(如1小时)自动删除,除非有正式注册用户approve这个发言。同时是谁approve、什么时候approve,系统不作记录。

    也就是说,如果我想匿名发言,我直接使用匿名功能/模式,但我的匿名消息必须经我自己、或者某个正式用户点开我发言然后认可并approve才能显示,否则不久就自动删除。


    edit:几种可能出现的问题我又仔细考虑了一下:

    1. 路人搞spam,如果动机是打广告或者喷人,看到消息无法显示理论上就不会继续;但如果动机是捣乱,用bot刷留言,那就需要一些自动侦测机制。

    2. 注册用户搞破坏,包括自己发spam自己approve、或者去approve别人的spam,这种情况下可以开启站长可见的临时记录(类似山海所说的机制)以引入accountability,或者在一段时间内提高approve匿名消息的门槛(如只有管理员可以approve)以增强control。

    3. 如果启用临时记录,怎么保证站长只保留24小时+他人不可见?这个我觉得没法“保证”,因为用户没法看到后台数据,开源代码更多显示的是一种诚意,而不是提供一种保障,所以只能信任站长。

  6. 穿鞋的企鹅  

    最后还是所有匿名的人都是一个人,那么匿名和不匿名没什么区别了。

    如果出匿名功能我肯定也会常用的,哈哈。

  7. thphd   2047前站长

    当然,这个方法也不是完美的,但是它会极大增加国宝收集training data的麻烦。而且兼顾了anti abuse。

    不过也许你或者其他人能有更好的方法?我抛砖引玉了。

    非常感谢,得到一些启发。

    我在想的是,如果我能确保输入用户的质量(邀请注册、审核注册),能否忽略anti-spam的角度,直接在编辑器加一个 [ √ 匿名发帖] 的选项呢?然后把发出的内容的uid设为匿名用户的uid即可,同时系统作一个临时性(比如保留24h)的记录,这样出问题的时候,后台有据可查。

  8. libgen 图书馆革命
    libgen   天堂应该是图书馆的模样。一个阅读诗歌的人要比不读诗歌的人更难被战胜。创造是一种拯救。创造拯救了创造者本身。
    内容已隐藏
    内容已被作者本人或管理员隐藏。 如有疑问,请点击菜单按钮,查看管理日志以了解原因。
  9. mountainsea   发完10个帖子,账号保持静默。账号是隔壁佛学院共用的,写的东西跟我无关,请领导不要上山下海找我。

    使用一个唯一uid的 [ √ 匿名发帖] 选项的问题在于无法与特定的某名匿名者在一段时间多次交流。比如主账号A使用匿名账号X和主账号B交流,这是主账号C也使用同样的匿名账号X在于主账号D交流,在同一个帖子中B和D是不能区分A和C的,会带来短暂交流混乱。我之前提出的使用短期绑定匿名账号的方法是为了解决这种情况:A绑定X_1匿名账号12小时,C绑定X_2匿名账号12小时;因为现在匿名账号可以唯一识别,那么么A和B的交流可以继续下去,C和D的交流也不会受到阻碍。

    另外还有一个anti-spam工作量问题。如果只有一个uid的 [ √ 匿名发帖] ,那么如果在一段时间内出现spam,需要站长用query去查询临时记录确定这段时间是谁发了什么帖子,然后再区分特定的人在某个帖子中前后发帖的逻辑中是否存在spam的故意意图;如果有多个人使用匿名发帖,需要人工来区分那些发帖是这个特定的人发的;这个人工的成本太高。短期绑定一个匿名ID可以去掉这个识别特定的人的ID的人工成本。

  10. thphd   2047前站长

    如果有多个人使用匿名发帖,需要人工来区分那些发帖是这个特定的人发的;这个人工的成本太高。短期绑定一个匿名ID可以去掉这个识别特定的人的ID的人工成本。

    用户每匿名发一贴,服务器直接在数据库中存一条记录,包含帖子ID和匿名发帖者的实际UID

    遇到问题就不用写query了,直接做一个页面,list anonymous posts in last 24 h, join user with uid

  11. mountainsea   发完10个帖子,账号保持静默。账号是隔壁佛学院共用的,写的东西跟我无关,请领导不要上山下海找我。

    除非有正式注册用户approve这个发言。同时是谁approve、什么时候approve,系统不作记录。

    这个加大了用户的人工成本,需要人去看和识别这些匿名发帖。需要一批无私的人持续地去审核匿名发帖,人工anti-spam。如果没有这批人,那么最后还是主ID来approve匿名ID的发帖,如果有记录的话和实名发帖没有区别。

    如果启用临时记录,怎么保证站长只保留24小时+他人不可见?

    off the top of my head,两个密匙由站长和另一个非站长ID掌握,需要阅读临时记录anti-spam,两份密匙同时解码还原临时记录。以此来保证临时记录不被重复保存和滥用。当然,这个方法人工成本还是不小,我相信还有其他人工成本更低的方法,大家可以集思广益。

  12. mountainsea   发完10个帖子,账号保持静默。账号是隔壁佛学院共用的,写的东西跟我无关,请领导不要上山下海找我。

    遇到问题就不用写query了,直接做一个页面,list anonymous posts in last 24 h, join user with uid

    想象一下这个帖子中有11个回帖:


    1 posted by User A

    2 posted by User B

    3 posted by User A using anonymous ID

    4 posted by User D

    5 posted by User E using anonymous ID

    6 posted by User A using anonymous ID

    7 posted by User B using anonymous ID

    8 posted by User D

    9 posted by User G using anonymous ID

    10 posted by User A using anonymous ID

    11 posted by User A


    scenario alpha: 这其中 post 6和 post 10在是User A在spam,但是中间隔了其他两个人的anonymous post,也许没有连续看到,我们不会发现A在spam;

    scenario beta: post 9和 post 10在是两个Users在发言,也许我们直接觉得如果是同一个人在发言,那么他们可能是在spam,直到我们后台发现他们其实是两个不同的ID,才发现是coincidence;

    scenario gamma: A和D在posts 3,4, 6,8中交流;但是在post 7中B用同样的匿名ID插了一句话,D以为是A说的,认为A对他有敌意,开始骂人;但是其实post 7并不是A说的。

    其他的scenarios其实还有很多(试试站在一个想搞乱论坛的人的角度,如何浑水摸鱼制造混乱),统一的匿名ID在coding实现上比较省事,但是带来的之后的审查以及监督的工作量会很大,从而导致没人想管,最终使得统一的匿名ID被滥用是可以被预见到的。


    最后,还是那句话,不用把这个需求放在首位,你应该还有更加high priority的list。匿名的需求从be4的论坛来看,我大概能看到还有3-4个和我一样有需求的人,但是他们和我一样,并不是常常泡网的。现在常常上网的人,可以增加人气的人,在我看来还是用特定的ID的人为主,满足他们或者相类似的人的需求更为重要。在初始阶段,人不多的时候,匿名还是不匿名对隐藏语言和能力指纹没有太大的帮助;所以等到论坛人气足了,在考虑我们这种很在乎匿名的人的需求也不迟。

    最最后,早点公网上线,对这个网的人气更有好处。

  13. libgen 图书馆革命
    libgen   天堂应该是图书馆的模样。一个阅读诗歌的人要比不读诗歌的人更难被战胜。创造是一种拯救。创造拯救了创造者本身。

    能不能使用同一uid的 [ √ 匿名发帖] 选项,但是随机生成前台ID(也就是令牌),然后绑定12/24小时?

    此外:文件放在Telegram不方便下载

  14. mountainsea   发完10个帖子,账号保持静默。账号是隔壁佛学院共用的,写的东西跟我无关,请领导不要上山下海找我。

    @libgen #5440847

    这个对匿名用户很方便,同意这个,估计站长的to do list要爆了。

  15. thphd   2047前站长
  16. ahgu  

    哪里可以下载? 谢谢

  17. lol3210 <s>123
    lol3210  
    内容已隐藏
    内容已被作者本人或管理员隐藏。 如有疑问,请点击菜单按钮,查看管理日志以了解原因。