给你的个人微信朋友圈数据生成一本电子书吧!

cloudBird16天前14 次点击

给你的个人微信朋友圈数据生成一本电子书吧!

简介

微信朋友圈保留着你的数据,它留住了美好的回忆,记录了我们成长的点点滴滴。发朋友圈从某种意义上来讲是在记录生活,感受生活,并从中看到了每个人每一步的成长。

这么一份珍贵的记忆,何不将它保存下来呢?只需一杯咖啡的时间,即可一键打印你的朋友圈。它可以是纸质书,也可以是电子书,可以长久保存,比洗照片好,又有时间足迹记忆。

  • 这本书,可以用来:
  • 送给孩子的生日礼物
  • 送给伴侣的生日礼物
  • 送给未来的自己
  • ……

现在,你可以选择打印电子书或者纸质书。打印纸质书的话,可以找第三方机构花钱购买;打印电子书的话,我们完全可以自己动手生成,这可以省下一笔不小的开支

部分截图

在开始写代码思路之前,我们先看看最终生成的效果。

电子书效果

纸质书效果

代码思路

获取微信书链接

看完效果图之后,开始进入代码编写部分。首先,由于朋友圈数据的隐私性较高,手动获取的话,需要使用 root 的安卓手机进行解密或对 pc 端备份的聊天记录数据库进行解密,这对大部分人来说难度较大。所以我们采取的思路是基于现有的数据进行打印电子书。

目前,已经有第三方服务支持导出朋友圈数据,微信公众号 [出书啦] 就提供了这样一种服务。这种服务很大可能性是基于安卓模拟器进行自动化采取操作的,具体就不详细讲了。

首先,关注该公众号,然后开始制作微信书。该过程为小编添加你为好友,然后你将朋友圈开放给他看,等一会后采集完毕后,小编会发给你一个专属链接,这个链接里面的内容就是你的个人朋友圈数据。

生成电子书

有了这个链接后,我们开始对该页面的内容进行打印。

整个过程基于 selenium 自动化操作,如果你有了解过 selenium 的话,那么其实该过程是很简单的。

首先,引导用户输入微信书链接,我们采用在浏览器弹出一个输入文本框的形式让用户输入数据。 首先,在 selenium 中执行 js 代码,js 代码中完成弹出输入文本框的功能。

输入微信书链接

# 以网页输入文本框形式提示用户输入 url 地址
def input_url():
    # js 脚本
    random_id = [str(random.randint(0, 9)) for i in range(0,10)]
    random_id = "".join(random_id)
    random_id = 'id_input_target_url_' + random_id
    js = """
        // 弹出文本输入框,输入微信书的完整链接地址
        target_url = prompt("请输入微信书的完整链接地址","https://");
        // 动态创建一个 input 元素
        input_target_url = document.createElement("input");
        // 为其设置 id,以便在程序中能够获取到它的值
        input_target_url.id = "id_input_target_url";
        // 插入到当前网页中
        document.getElementsByTagName("body")[0].appendChild(input_target_url);
        // 设置不可见
        document.getElementById("id_input_target_url").style.display = 'none';
        // 设置 value 为 target_url 的值
        document.getElementById("id_input_target_url").value = target_url
    """
    js = js.replace('id_input_target_url', random_id)

    # 执行以上 js 脚本
    driver.execute_script(js)

上述 js 代码的具体步骤为:弹出一个输入文本框,创建一个动态元素,随机命名该元素的 id,并将这个动态元素插入到当前页面中,使得可以在 python 中通过 selenium 获取到输入文本框的内容。

接着,在 selenium 中检测是否存在该弹框,如果不存在则获取该弹框的内容,并进行后续步骤,该过程代码如下:

# 执行以上 js 脚本
driver.execute_script(js)
# 判断弹出框是否存在
while(True):
    try:
        # 检测是否存在弹出框
        alert = driver.switch_to.alert
        time.sleep(0.5)
    except:
        # 如果抛异常,说明当前页面不存在弹出框,即用户点击了取消或者确定
        break
# 获取用户输入的链接地址
target_url = WebDriverWait(driver, 20).until(EC.presence_of_element_located((By.ID, random_id)))
value = target_url.get_attribute('value')
# 删除空格
value = value.strip() 

至此,value的值即为弹出框返回的内容。(你可能会问,直接另 value=微信书链接不就可以了吗?事实上确实可以 ><

最新回复 (42) 直到 2019-06-12 15:00
返回