【抛砖引玉】我是如何高效查看 L 站帖子的。

抛砖引玉:了解到 L 站有 Telegram 群聊频道 LINUX DO Channel,于是就通过自己仅有的一点 Python 知识写了点代码,并在每周周一统一查看上一周的帖子合集。

具体代码(另存为 L.py):

import json
import csv

# constant variables
weekly = {
    "01": ["2024-12-30", "2025-01-06"],
    "02": ["2025-01-06", "2025-01-13"],
    "03": ["2025-01-13", "2025-01-20"],
    "04": ["2025-01-20", "2025-01-27"],
    "05": ["2025-01-27", "2025-02-03"],
    "06": ["2025-02-03", "2025-02-10"],
    "07": ["2025-02-10", "2025-02-17"],
    "08": ["2025-02-17", "2025-02-24"],
    "09": ["2025-02-24", "2025-03-03"],
    "10": ["2025-03-03", "2025-03-10"],
    "11": ["2025-03-10", "2025-03-17"],
    "12": ["2025-03-17", "2025-03-24"],
    "13": ["2025-03-24", "2025-03-31"],
    "14": ["2025-03-31", "2025-04-07"],
    "15": ["2025-04-07", "2025-04-14"],
    "16": ["2025-04-14", "2025-04-21"],
    "17": ["2025-04-21", "2025-04-28"],
    "18": ["2025-04-28", "2025-05-05"],
}

def get_messages_list(json_file):
        return json.load(open(json_file))['messages']

def get_weekly_infos_csv(posts, weekly, rank):
    rank = str(rank)
    csvfile = f"Lurls-Weekly-{rank}.csv"
    # fieldnames = ["Date", "URL", "Title"]
    fieldnames = ["URL", "Needed", "Title"]
    time_start, time_end = weekly[rank]
    
    with open(csvfile, "w", newline="", encoding="utf-8-sig") as csvfile:
        # writer the header
        writer = csv.DictWriter(csvfile, fieldnames=fieldnames, delimiter="\t")
        writer.writeheader()
        
        # traverse each post
        for _ in range(len(posts)):
            post = posts[_]
            if time_start < post['date'] < time_end:
                # traverse each part in the post
                for part in post["text"]:
                    # find the part with ['href'] and ['text'] attributes
                    try:
                        writer.writerow({
                            # "Date": post["date"],
                            "URL": part["href"],
                            "Needed": "Yes",
                            "Title": part["text"],
                        })
                    except:
                        continue
    return csvfile

def get_weekly_infos_md(posts, weekly, rank):
    rank = str(rank)
    mdfile = f"Lurls-Weekly-{rank}.md"
    time_start, time_end = weekly[rank]
    
    with open(mdfile, "w", newline="", encoding="utf-8-sig") as mdfile:
        # traverse each post
        for _ in range(len(posts)):
            post = posts[_]
            if time_start < post['date'] < time_end:
                # traverse each part in the post
                for part in post['text']:
                    # find the part with ['href'] and ['text'] attributes
                    try:
                        content = f"- [{part['text']}]({part['href']}) \n\n"
                        mdfile.write(content)
                    except:
                        continue
    return mdfile

def transfer_weekly_csv2md(rank):
    """
    运行文件,得到 .csv 文件
    在 .csv 文件中遇到不需要的帖子,在 Needed 一栏中用空格把 Yes 给替换掉即可
    遍历一遍之后,注释掉上方两行代码,同时取消注释下方的这一行代码
    再运行文件,得到 .md 文件
    .md 文件才是我想要放到周刊中的 digest 部分的内容
    """
    csvfile = f"Lurls-Weekly-{rank}.csv"
    mdfile = "((" + f"Lurls-Weekly-{rank}-csv2md.md"
    
    with (
        open(csvfile, "r", encoding="utf-8-sig") as csv_file,
        open(mdfile, "w", encoding="utf-8-sig") as md_file,
    ):
        reader = csv.DictReader(csv_file, delimiter="\t")
        for row in reader:
            if row["Needed"] == "Yes":
                md_file.write(f"- [ ] [{row['Title']}]({row['URL']}) \n\n")
    return mdfile

def main():
    L_posts = get_messages_list("result.json")
    get_weekly_infos_csv(L_posts, weekly, 12)
    
    # transfer_weekly_csv2md(12)

if __name__ == "__main__":
    main()


具体操作:

  1. 导出 json 格式历史记录:每周一从 LINUX DO Channel 中导出频道历史记录 result.json 文件;当然哪天都行,反正处理的都是上一周的聊天记录。
  2. 修改周数:只需将 main() 中的周期数(上面代码对应的是 12)修改为上一周的周数即可。
  3. 运行:终端运行一遍 python L.py,得到 Lurls-Weekly-12.csv 文件,其中存储了发布于这一周的所有帖子的一些信息,一行对应一个帖子,默认每一个帖子的 Needed 列都是 Yes
  4. 陆陆续续有事没事就打开文件敲空格:(个人喜欢)在 Emeditor 中打开并编辑 .csv 文件;对于不感兴趣的低质量的帖子,我会把这一行对应 Needed 这一列的那个格子中的 Yes 用空格替换掉。
    • 经验数据:一周对应的 .csv 文件会有 3000-4000 行,最终保留下来 200-400 行。
  5. 回到 L.py:注释掉 main() 的前两行代码,取消注释后面的代码,再在终端运行一遍 python L.py,得到 ((Lurls-Weekly-12-csv2md.md 文件,里面存储了剩下的这几百行链接,只不过改成了 markdown 能够识别的 []() 语法,方便后续的别的操作。
    • 这里生成的 ((Lurls-Weekly-12-csv2md.md 文件名有 (( ,是因为我在使用 git 时不跟踪这种“中间文件”。

效果图如下:

但是这样做肯定有缺点:

  • result.json
    • 对于 L 站的二级、三级帖子,在 Telegram 群聊中是不会自动生成相应帖子,即 result.json 中仅存储一级帖子,因此帖子整体含金量不算高。
  • L.py
    • 筛选条件只有“是否发布于某一周”,没有更多的筛选器;即筛选力度太弱,至少下面的功能都没实现
      • :sparkles:谁发的帖子我不看
      • :sparkles:带有哪些标签的帖子我不看
      • :sparkles:带有哪些关键字的帖子我不看
      • :sparkles:只有几个人关注/回答的帖子我不看
  • .csv
    • 这就导致每周都要在 .csv 文件中敲击几千下空格,虽然空格不算很麻烦,但是几千下。。。这种操作可以在简化一下吧。

总之,欢迎各位能够提供一下改进的思路或者是别的思路,感谢喵。

6 个赞

无他,靠量堆罢了 :tieba_087:

2 个赞

用转发器转发L站tg频道的贴子,屏蔽些关键字和用户就能过滤掉很多不感兴趣的帖子了。按我自己的关键字过滤后,一天下来就70-80条贴子左右,如果上ai二次过滤我自己不感兴趣的内容估计一天也就50条贴子

9 个赞

谢谢佬,我去学习一下,感谢喵!

1 个赞

限制的等级的帖子是不是不在频道?

是的,频道不会显示,这个缺点我补上,谢谢。

有没有 类似的 处理微信消息的程序呢?

L站不做智能推荐,你们却自己把自己困在信息茧房里 :tieba_087:

7 个赞

爱我所爱:thinking:
智勇多困于所溺:sob:

微信不提供类似的api,需要逆向客户端或者用web端,但都有封号的风险

我都是手动刷的,首先是首页最新刷一波下去,然后是点最热,看今日最热、本周最热一波往下刷。偶尔刷一波别的类别。反正收藏了好多ai的新内容,有些丢收藏夹暂时不理会,有些丢to do列表


今日推荐:

https://linux.do/t/topic/494741

https://linux.do/t/topic/433091

1 个赞

还有个缺点,想看详细的还得点进去看。建议把论坛的内容接入到大模型,让大模型一键提取近期内容。

感觉现在站里的内容,扫一眼好像也就能判断帖子的质量了,所以这是做了一个目录不用自己手动翻吗?

L站的搜索功能还能优化嘛tieba_087

是的,本质上就是一个目录(表格)。
其实不管是在 L 站内部还是在 Telegram 频道内部,前者至少还有快捷键 j k 等快速跳动,后者则依靠的是鼠标滚轮或者是手指滑动。
随着用户下沉(请允许我这么说),帖子愈发日常和频繁,因此汇总成目录查看还是有点必要。

sorry but 权限帖