普通视图

发现新文章,点击刷新页面。
昨天以前首页
  • ✇宇阳 - 花有重开日, 人无再少年
  • 突破瓶颈,月薪过万
    # 突破瓶颈,月薪过万 哈哈,又消失了一段时间 在去年 `12` 月 `24` 日老板让我们研发一款跨境支付系统,项目周期为 `3` 个月,在此期间每天无偿加班 `3` 小时,单休,`996` 工作制。项目完成后老板承诺涨薪 + 5万奖金。 这段时间忙得不可开交,每天敲 `12` 个小时代码,一下班就困得要死,一睁眼就是上班,每天彻底失去了个人时间,现在想想都不知道怎么熬过来的。 经过 `3` 个月的开发,目前项目已经在测试阶段了,计划着本周发布上线。 我的领导看到了我的付出,帮我提交涨了涨薪申请,我最开始觉得也就涨一两千的样子,没想到一次性涨了 `3k` ,这让我无比震惊,算是突破了月薪过万的瓶颈。当然还有后续的 `5` 万奖金也会在这两周内发放 现在这艰难的大环境,我深知以我这学历能找到工作就已经是万幸了,即使找到了工作,可能也需要 `3` 年的沉淀才能突破到 `10k` 这个瓶颈,而如今仅工作半年就突破到了这个境界。说真的我很感谢我的领导,我知道我能走到这一步是因为有了我领导的帮助,他一直在帮我争取涨薪的机会并想方设法帮我完成了 `2` 次涨薪,对我算得上有知遇
     

突破瓶颈,月薪过万

# 突破瓶颈,月薪过万 哈哈,又消失了一段时间 在去年 `12` 月 `24` 日老板让我们研发一款跨境支付系统,项目周期为 `3` 个月,在此期间每天无偿加班 `3` 小时,单休,`996` 工作制。项目完成后老板承诺涨薪 + 5万奖金。 这段时间忙得不可开交,每天敲 `12` 个小时代码,一下班就困得要死,一睁眼就是上班,每天彻底失去了个人时间,现在想想都不知道怎么熬过来的。 经过 `3` 个月的开发,目前项目已经在测试阶段了,计划着本周发布上线。 我的领导看到了我的付出,帮我提交涨了涨薪申请,我最开始觉得也就涨一两千的样子,没想到一次性涨了 `3k` ,这让我无比震惊,算是突破了月薪过万的瓶颈。当然还有后续的 `5` 万奖金也会在这两周内发放 现在这艰难的大环境,我深知以我这学历能找到工作就已经是万幸了,即使找到了工作,可能也需要 `3` 年的沉淀才能突破到 `10k` 这个瓶颈,而如今仅工作半年就突破到了这个境界。说真的我很感谢我的领导,我知道我能走到这一步是因为有了我领导的帮助,他一直在帮我争取涨薪的机会并想方设法帮我完成了 `2` 次涨薪,对我算得上有知遇之恩
  • ✇游钓四方的博客
  • 注册 Chrome Web Store 开发者游钓四方的博客
    年前曾尝试过 Chrome 扩展开发,《写一个Chrome表单自动化插件》,但是由于没有注册 Chrome Web Store 开发者,无法上传到 Chrome 应用商店。 注册 WildCard Chrome 注册开发者需要五美元,由于我没有境外信用卡就一直卡在这,2022 年我在杭州办过一张中信的双币卡,年费很高,后来经济紧张时注销了,现在急着用外币还挺麻烦,折腾一圈,最终无脑选择了 WildCard,尽管网上对它负面评论铺天盖地。 WildCard 开卡费用是 10.99 美元/年,实际付款 79.71 人民币,按照今天的市场汇率 7.23,实际多付了 0.24,而且这只是开卡费用,充值另算。 开卡后我充值了 10 美元,支付宝付款 75.07,到账金额 10 美元: \[\frac{2.77}{75.07} \times 100\% \approx 3.69\%\] 四个点我能接受(接不接受都要受着),这个开卡费不便宜,毕竟钱不是大风刮来的,所以注册时,我创建了两个号,推荐注册返现两美金… 注册 Chrome Web Store 开发者
     

注册 Chrome Web Store 开发者

2025年3月20日 00:03

年前曾尝试过 Chrome 扩展开发,《写一个Chrome表单自动化插件》,但是由于没有注册 Chrome Web Store 开发者,无法上传到 Chrome 应用商店。

注册 WildCard

Chrome 注册开发者需要五美元,由于我没有境外信用卡就一直卡在这,2022 年我在杭州办过一张中信的双币卡,年费很高,后来经济紧张时注销了,现在急着用外币还挺麻烦,折腾一圈,最终无脑选择了 WildCard,尽管网上对它负面评论铺天盖地。

WildCard 开卡账单

WildCard 开卡费用是 10.99 美元/年,实际付款 79.71 人民币,按照今天的市场汇率 7.23,实际多付了 0.24,而且这只是开卡费用,充值另算。

开卡后我充值了 10 美元,支付宝付款 75.07,到账金额 10 美元:

\[\frac{2.77}{75.07} \times 100\% \approx 3.69\%\]

四个点我能接受(接不接受都要受着),这个开卡费不便宜,毕竟钱不是大风刮来的,所以注册时,我创建了两个号,推荐注册返现两美金…

注册 Chrome Web Store 开发者

Chrome Web Store 账单

注册账号就很容易了,Google 绑卡付钱就行。但是如果要销售发布就很麻烦:

个人交易者声明

  • 您需要提供一个手机号码以验证是您本人在操作
    • 您将通过手机接收代码
  • 用于证明是您本人的身份证件
  • 可接受的文件包括:
    • 驾照
    • 护照
    • 州身份证明
    • 绿卡
  • 您需要提供一份显示您的姓名和当前地址的文件
  • 可接受的文件包括:
    • 由政府签发的文件或带照片的身份证件
    • 公共事业缴费单或话费账单(日期在过去 60 天内)
    • 银行对账单(日期在过去 60 天内)
    • 租赁合同或抵押贷款合同

因为 Google 已退出中国市场,不支持交易。而我是美国 Visa 卡,面对这样的要求不容易做到。

日后再说吧,往后这段时间,我打算把博客评论表单自动填充插件重构一下,然后上架 Chrome 应用商店。

  • ✇游钓四方的博客
  • 空腹骑行75公里游钓四方的博客
    周六 最近郑州天气突然转冷,骑行频率也降了下来,周六正好赶上休息,实在是憋坏了!今天不管刮风下雨,必须出去骑一趟 原计划直接奔开封,结果路过龙湖就停了下来。好久没来了,上次来还是鹅毛大雪天,如今雪没了,只剩下鹅 周六的公园人满为患,没法骑。我推着车沿湖边缓行,遥望着远处炸水的不知名鱼,不由自主的想蹲下摸摸湖水,真的很想钓鱼,自到郑州以来,我连最爱的路亚竿都没摸过 此时正值中午,小孩在沙滩上牵着风筝奔跑,大人排队买小吃,顿时勾起了不少儿时回忆,我也好想光着脚奔跑在沙滩上… 在龙湖公园出来后,我关掉了导航线瞎跑,根本不认识路,不知道自己在哪,扫大街呗 话说现在骑车很少拍照,不是不爱拍,而是懒得下车,即使趴到腰酸,感觉腰快要断了,也不想停下来 周日 拍这张照片时,已经快饿晕了,周六晚上吃得少,周日早上又空腹出门,体力消耗得厉害… 周日早晨睡到自然醒,一看表,我整个人都快立正了,居然八点半了。着急忙慌洗漱后,脱下内衣裤直接换上骑行服,背上包,拿了五块巧克力出发了。因为周一要上班,所以今天必须放纵一下,出发前大致算了算,来回返程再加上逛街的时间,早饭根本来不及吃
     

空腹骑行75公里

2025年3月12日 15:36

周六

最近郑州天气突然转冷,骑行频率也降了下来,周六正好赶上休息,实在是憋坏了!今天不管刮风下雨,必须出去骑一趟

原计划直接奔开封,结果路过龙湖就停了下来。好久没来了,上次来还是鹅毛大雪天,如今雪没了,只剩下鹅

倒挂白鹅

周六的公园人满为患,没法骑。我推着车沿湖边缓行,遥望着远处炸水的不知名鱼,不由自主的想蹲下摸摸湖水,真的很想钓鱼,自到郑州以来,我连最爱的路亚竿都没摸过

龙湖·北岸

此时正值中午,小孩在沙滩上牵着风筝奔跑,大人排队买小吃,顿时勾起了不少儿时回忆,我也好想光着脚奔跑在沙滩上…

龙湖·人工沙滩

在龙湖公园出来后,我关掉了导航线瞎跑,根本不认识路,不知道自己在哪,扫大街呗

STRAVA 74.6km  爬升313m  时间4h 19m

话说现在骑车很少拍照,不是不爱拍,而是懒得下车,即使趴到腰酸,感觉腰快要断了,也不想停下来

周日

拍这张照片时,已经快饿晕了,周六晚上吃得少,周日早上又空腹出门,体力消耗得厉害…

周日早晨睡到自然醒,一看表,我整个人都快立正了,居然八点半了。着急忙慌洗漱后,脱下内衣裤直接换上骑行服,背上包,拿了五块巧克力出发了。因为周一要上班,所以今天必须放纵一下,出发前大致算了算,来回返程再加上逛街的时间,早饭根本来不及吃…哎…

大约骑了25公里,在中石化买了瓶宝矿力水特。又骑行了二三十公里到了贾鲁河桥,饿的没劲,更别说爬坡了,挂上小盘,我慢悠悠到了桥中间,休息了几分钟,把五块巧克力补给全吃了

郑州·贾鲁河桥

就这样空腹骑到了开封郊区,此时的里程已经来到了 75.38公里,用时3小时23分钟

到达开封后,心里那股坚持的信念瞬间消失了,又渴又饿,高德帮我找了最近一家名为三不炒(开封总店)的小炒店,我把车子靠着门店随便一放,就去买葡萄糖了

就去买葡萄糖了

买完水出来发现要排队,人还不少,我是真的饿得快走不动了,但还是懒得换地方,抱着水坐在外面等了半小时。饿得快虚脱了,感觉此时此刻,就算把馒头挂我脖子上都能饿死

我前面排了八个人

排队加吃饭花了一个半小时,吃得太撑,骑上车都趴不下去,推着车穿过老巷子走到了湖边

对面就是清明上河园

御河桥洞下

御河桥洞下

正在乐钓的五星开封好市民

STRAVA 164.1km  爬升417m  时间8h 5m

回到家已经八点半了,这条郑开大道路线真心推荐,毕竟二刷了,虽然沿途风景平平,但对于郑州来说,已经是顶级骑行路线了,一个人骑行在郑开大道,握着下把位,不用担心刹车,不用担心前方有没有人,听着歌,摇着车,也不枉来郑州走一遭

  • ✇游钓四方的博客
  • 利用 Go + COS + GitHub 重构 RSS 爬虫游钓四方的博客
    之前我写过一篇《利用Go+Github Actions写个定时RSS爬虫》来实现这一目的,主要是用 GitHub Actions + Go 进行持续的 RSS 拉取,再把结果上传到 GitHub Pages 站点 但是遇到一些网络延迟、TLS 超时问题,导致订阅页面访问速度奇慢,抓取的数据也不完整,后来时断时续半个月重构了代码,进一步增强了并发和容错机制 在此感谢 GPT o1 给予的帮助,我已经脱离老本行很多年了,重构的压力真不小,有空就利用下班的时间进行调试,在今天凌晨 03:00 我终于写完了 1. 为什么要重构 旧版本主要基于 GitHub Actions 的定时触发,抓取完后把结果存放进 _data/rss_data.json 然后 Jekyll 就可以直接引用这个文件来展示订阅,但是这个方案有诸多不足: 网络不稳定导致的抓取失败 由于原先的重试机制不够完善,GitHub Actions 在国外,RSS 站点大多在国内,一旦连接超时就挂,一些 RSS 无法成功抓取 单线程串行,速度偏慢 旧版本一次只能串行抓取
     

利用 Go + COS + GitHub 重构 RSS 爬虫

2025年3月12日 03:26

之前我写过一篇《利用Go+Github Actions写个定时RSS爬虫》来实现这一目的,主要是用 GitHub Actions + Go 进行持续的 RSS 拉取,再把结果上传到 GitHub Pages 站点

但是遇到一些网络延迟、TLS 超时问题,导致订阅页面访问速度奇慢,抓取的数据也不完整,后来时断时续半个月重构了代码,进一步增强了并发和容错机制

在此感谢 GPT o1 给予的帮助,我已经脱离老本行很多年了,重构的压力真不小,有空就利用下班的时间进行调试,在今天凌晨 03:00 我终于写完了

1. 为什么要重构

旧版本主要基于 GitHub Actions 的定时触发,抓取完后把结果存放进 _data/rss_data.json 然后 Jekyll 就可以直接引用这个文件来展示订阅,但是这个方案有诸多不足:

  1. 网络不稳定导致的抓取失败

    由于原先的重试机制不够完善,GitHub Actions 在国外,RSS 站点大多在国内,一旦连接超时就挂,一些 RSS 无法成功抓取

  2. 单线程串行,速度偏慢

    旧版本一次只能串行抓取 RSS,效率低,数量稍多就拉长整体执行时间,再加上外网到内地的延时,更显迟缓

  3. 日志不够完善

    出错时写到的日志文件只有大概的错误描述,无法区分是解析失败、头像链接失效还是RSS本身问题,排查不便

  4. 访问速度影响大

    这是主要的重构原因!在旧版本里,抓取后的 JSON 数据是要存储到 Github 仓库的,虽然有 CDN 加持,但 GitHub Pages 的定时任务会引起连锁反应,当新内容刷新时容易出现访问延迟,极端情况下网页都挂了

    重构后,在此基础上进行了大幅重构,引入了并发抓取 + 指数退避重试 + GitHub/COS 双端存储的能力,抓取稳定性和页面访问速度都得到显著提升

2. 主要思路

2.1 整体流程

先看个简单的流程图

        +--------------------------+
        | 1. 读取RSS列表(双端可选)  |
        +------------+-------------+
                     |
                     v
           +---------------------+
           | 2. 并发抓取RSS,限流   |
           |  (max concurrency)  |
           +-------+-------------+
                   |
                   v
        +------------------------------+
        | 3. 指数退避算法 (重试解析失败)  |
        +------------------------------+
                   |
                   v
           +-------------------+
           | 4. 结果整合排序    |
           +--------+----------+
                    |
                    v
        +-------------------------+
        | 5. 上传 RSS (双端可选)   |
        +-------------------------+
                    |
                    v
           +--------------------+
           | 6. 写日志到GitHub   |
           +--------------------+
  1. 并发抓取 + 限流
    通过 Go 的 goroutine 并发抓取 RSS,同时用一个 channel 来限制最大并发数

  2. 指数退避重试
    每个 RSS 如果第一次抓取失败,则会间隔几秒后再次重试,且间隔呈指数级递增(1s -> 2s -> 4s),最多重试三次,极大提高成功率

  3. 灵活存储
    RSS_SOURCE: 可以决定从 COS 读取一个远程 txt 文件(里面存放 RSS 列表),或直接从 GitHub 的 data/rss.txt 读取
    SAVE_TARGET: 可以把抓取结果上传到 GitHub,或者传到腾讯云 COS

  4. 日志自动清理
    每次成功写入日志后,会检查 logs/ 目录下的日志文件,若超过 7 天就自动删除,避免日志越积越多

2.2 指数退避

上一次写指数退避,还是在养老院写PHP的时候,时过境迁啊,这段算法我调试了很久,其实不难,也就是说失败一次,就等待更长的时间再重试,配置如下:

  • 最大重试次数: 3
  • 初始等待: 1秒
  • 等待倍数: 2.0

也就是说失败一次就加倍等待,下次若依然失败就再加倍,如果三次都失败则放弃处理

// fetchAllFeeds 并发抓取所有RSS链接,返回抓取结果及统计信息
//
// Description:
//
//   该函数读取传入的所有RSS链接,使用10路并发进行抓取
//   在抓取过程中对解析失败、内容为空等情况进行统计
//   若抓取的RSS头像缺失或无法访问,将替换为默认头像
//
// Parameters:
//   - ctx           : 上下文,用于控制网络请求的取消或超时
//   - rssLinks      : RSS链接的字符串切片,每个链接代表一个RSS源
//   - defaultAvatar : 备用头像地址,在抓取头像失败或不可用时使用
//
// Returns:
//   - []feedResult         : 每个RSS链接抓取的结果(包含成功的Feed及其文章或错误信息)
//   - map[string][]string  : 各种问题的统计记录(解析失败、内容为空、头像缺失、头像不可用)
func fetchAllFeeds(ctx context.Context, rssLinks []string, defaultAvatar string) ([]feedResult, map[string][]string) {
	// 设置最大并发量,以信道(channel)信号量的方式控制
	maxGoroutines := 10
	sem := make(chan struct{}, maxGoroutines)

	// 等待组,用来等待所有goroutine执行完毕
	var wg sync.WaitGroup

	resultChan := make(chan feedResult, len(rssLinks)) // 用于收集抓取结果的通道
	fp := gofeed.NewParser()                           // RSS解析器实例

	// 遍历所有RSS链接,为每个RSS链接开启一个goroutine进行抓取
	for _, link := range rssLinks {
		link = strings.TrimSpace(link)
		if link == "" {
			continue
		}
		wg.Add(1)         // 每开启一个goroutine,对应Add(1)
		sem <- struct{}{} // 向sem发送一个空结构体,表示占用了一个并发槽

		// 开启协程
		go func(rssLink string) {
			defer wg.Done()          // 协程结束时Done
			defer func() { <-sem }() // 函数结束时释放一个并发槽

			var fr feedResult
			fr.FeedLink = rssLink

			// 抓取RSS Feed, 无法解析时,使用指数退避算法进行重试, 有3次重试, 初始1s, 倍数2.0
			feed, err := fetchFeedWithRetry(rssLink, fp, 3, 1*time.Second, 2.0)
			if err != nil {
				fr.Err = wrapErrorf(err, "解析RSS失败: %s", rssLink)
				resultChan <- fr
				return
			}

			if feed == nil || len(feed.Items) == 0 {
				fr.Err = wrapErrorf(fmt.Errorf("该订阅没有内容"), "RSS为空: %s", rssLink)
				resultChan <- fr
				return
			}

			// 获取RSS的头像信息(若RSS自带头像则用RSS的,否则尝试从博客主页解析)
			avatarURL := getFeedAvatarURL(feed)
			fr.Article = &Article{
				BlogName: feed.Title,
			}

			// 检查头像可用性
			if avatarURL == "" {
				// 若头像链接为空,则标记为空字符串
				fr.Article.Avatar = ""
			} else {
				ok, _ := checkURLAvailable(avatarURL)
				if !ok {
					fr.Article.Avatar = "BROKEN" // 无法访问,暂记为BROKEN
				} else {
					fr.Article.Avatar = avatarURL // 正常可访问则记录真实URL
				}
			}

			// 只取最新一篇文章作为结果
			latest := feed.Items[0]
			fr.Article.Title = latest.Title
			fr.Article.Link = latest.Link

			// 解析发布时间,如果 RSS 解析器本身给出了 PublishedParsed 直接用,否则尝试解析 Published 字符串
			pubTime := time.Now()
			if latest.PublishedParsed != nil {
				pubTime = *latest.PublishedParsed
			} else if latest.Published != "" {
				if t, e := parseTime(latest.Published); e == nil {
					pubTime = t
				}
			}
			fr.ParsedTime = pubTime
			fr.Article.Published = pubTime.Format("02 Jan 2006")

			resultChan <- fr
		}(link)
	}

	// 开启一个goroutine等待所有抓取任务结束后,关闭resultChan
	go func() {
		wg.Wait()
		close(resultChan)
	}()

	// 用于统计各种问题
	problems := map[string][]string{
		"parseFails":   {}, // 解析 RSS 失败
		"feedEmpties":  {}, // 内容 RSS 为空
		"noAvatar":     {}, // 头像地址为空
		"brokenAvatar": {}, // 头像无法访问
	}
	// 收集抓取结果
	var results []feedResult

	for r := range resultChan {
		if r.Err != nil {
			errStr := r.Err.Error()
			switch {
			case strings.Contains(errStr, "解析RSS失败"):
				problems["parseFails"] = append(problems["parseFails"], r.FeedLink)
			case strings.Contains(errStr, "RSS为空"):
				problems["feedEmpties"] = append(problems["feedEmpties"], r.FeedLink)
			}
			results = append(results, r)
			continue
		}

		// 对于成功抓取的Feed,如果头像为空或不可用则使用默认头像
		if r.Article.Avatar == "" {
			problems["noAvatar"] = append(problems["noAvatar"], r.FeedLink)
			r.Article.Avatar = defaultAvatar
		} else if r.Article.Avatar == "BROKEN" {
			problems["brokenAvatar"] = append(problems["brokenAvatar"], r.FeedLink)
			r.Article.Avatar = defaultAvatar
		}
		results = append(results, r)
	}
	return results, problems
}

2.3 并发抓取 + 限流

为避免一下子开几十上百个协程导致阻塞,可以配合一个带缓存大小的 channel

maxGoroutines := 10
sem := make(chan struct{}, maxGoroutines)

for _, rssLink := range rssLinks {
    // 启动 goroutine 前先写入一个空 struct
    sem <- struct{}{}
    go func(link string) {
        // goroutine 执行结束后释放 <-sem
        defer func() { <-sem }()
        fetchFeedWithRetry(link, parser, 3, 1*time.Second, 2.0)
        // ...
    }(rssLink)
}

3. 对比旧版本的改进

  1. 容错率显著提升

    遇到网络抖动、超时等问题,能以10路并发限制式自动重试,很少出现直接拿不到数据

  2. 抓取速度更快

    以 10 路并发为例,对于数量多的 RSS,速度提升明显

  3. 日志分类更细

    分清哪条 RSS 是解析失败,哪条头像挂了,哪条本身有问题,后续维护比只给个403 Forbidden方便太多

  4. 支持 COS

    可将最终 data.json 放在 COS 上进行 CDN 加速;也能继续放在 GitHub,视自己需求而定

  5. 自动清理过期日志

    每次抓取后检查 logs/ 目录下 7 天之前的日志并删除,不用手工清理了

4. Go 生成的 JSON 和日志长啥样

4.1 RSS

抓取到的文章信息会按时间降序排列,示例:

{
  "items": [
    {
      "blog_name": "obaby@mars",
      "title": "品味江南(三)–虎丘塔 东方明珠",
      "published": "10 Mar 2025",
      "link": "https://oba.by/2025/03/19714",
      "avatar": "https://oba.by/wp-content/uploads/2020/09/icon-500-100x100.png"
    },
    {
      "blog_name": "风雪之隅",
      "title": "PHP8.0的Named Parameter",
      "published": "10 May 2022",
      "link": "https://www.laruence.com/2022/05/10/6192.html",
      "avatar": "https://www.laruence.com/logo.jpg"
    }
  ],
  "updated": "2025年03月11日 07:15:57"
}

4.2 日志

程序每次运行完毕后,把抓取统计和问题列表写到 GitHub 仓库 logs/YYYY-MM-DD.log:

[2025-03-11 07:15:57] 本次订阅抓取结果统计:
[2025-03-11 07:15:57] 共 25 条RSS, 成功抓取 24 条.
[2025-03-11 07:15:57] ✘ 有 1 条订阅解析失败:
[2025-03-11 07:15:57] - https://tcxx.info/feed
[2025-03-11 07:15:57] ✘ 有 1 条订阅头像无法访问, 已使用默认头像:
[2025-03-11 07:15:57] - https://www.loyhome.com/feed

5. 照葫芦画瓢

如果你也想玩玩 LhasaRSS

  1. 准备一份 RSS 列表(TXT):

    格式:每行一个 URL
    如果 RSS_SOURCE = GITHUB,则可以放在项目中的 data/rss.txt
    如果 RSS_SOURCE = COS,就把它上传到某个 https://xxx.cos.ap-xxx.myqcloud.com/rss.txt

  2. 配置好环境变量:

    默认所有数据保存到 Github,所以 COS API 环境变量不是必要的

     env:
         TOKEN:                    ${{ secrets.TOKEN }}                    # GitHub Token
         NAME:                     ${{ secrets.NAME }}                     # GitHub 用户名
         REPOSITORY:               ${{ secrets.REPOSITORY }}               # GitHub 仓库名
         TENCENT_CLOUD_SECRET_ID:  ${{ secrets.TENCENT_CLOUD_SECRET_ID }}  # 腾讯云 COS SecretID
         TENCENT_CLOUD_SECRET_KEY: ${{ secrets.TENCENT_CLOUD_SECRET_KEY }} # 腾讯云 COS SecretKey
         RSS:                      ${{ secrets.RSS }}                      # RSS 列表文件
         DATA:                     ${{ secrets.DATA }}                     # 抓取后的数据文件
         DEFAULT_AVATAR:           ${{ secrets.DEFAULT_AVATAR }}           # 默认头像 URL
         RSS_SOURCE                ${{ secrets.RSS_SOURCE }}               # 可选参数 GITHUB or COS
         SAVE_TARGET               ${{ secrets.SAVE_TARGET }}              # 可选参数 GITHUB or COS
    


  3. 部署并运行

    只需 go run . 或在 GitHub Actions workflow_dispatch 触发 运行结束后,就会在 data 文件夹更新 data.json,日志则写进 GitHub logs/ 目录,并且自动清理旧日志

注:如果你依旧想完全托管在 COS 上,需要把 RSS_SOURCE 和 SAVE_TARGET 都写为 COS,然后使用 GitHub Actions 去调度

相关文档

Cloudflare/Vercel项目推荐(4)

作者 LiuShen
2025年3月20日 21:52
很久没有推荐项目啦,之前的三次项目分享反馈都很好,涵盖了很多领域的项目,大家也很喜欢那些项目,近期我又收集了一些,数量达到了,那就再来分享一些吧!项目很难找的QAQ!

脚本分享:CDN 流量触顶后自动切换至 Cloudflare

作者 HowieHz
2025年3月19日 23:10
方案价值与应用场景 防御性场景 - DDoS 攻击流量过载保护 当你的 CDN 被恶意攻击,触发流量封顶限制。程序会将 DNS 指向 Cloudflare,保证站点访问的同时利用 Cloudflare 的防火墙功能抵御攻击。 当你做好 IP 屏蔽,重新启用 CDN 时,程序会自动恢复原本的国内外分流

官方 BUG 快薅!Halo 永久/买断用户可额外获得一份买断许可

作者 HowieHz
2025年3月19日 19:05
本文是 限时特惠!1¥ 立即解锁 1Panel 专业版全功能 61 天 的补充说明 2。 不仅限于 1Panel 永久授权/买断许可证!如果你先前已经有 Halo 永久授权/买断许可证,你可以也再领取一份当前在售的版本买断产品。 官方说明原话是:永久授权、版本买断许可无法续期,二者都将获赠当前在售的

老用户专享!已有 1Panel 永久授权/买断许可用户可再领免费买断许可证!

作者 HowieHz
2025年3月18日 20:17
本文是 限时特惠!1¥ 立即解锁 1Panel 专业版全功能 61 天 的补充说明。 如果你先前已经有 1Panel 永久授权/买断许可证,你可以再领取一份当前在售的版本买断产品。 直接从流程的第五步开始即可。 活动截止到 2025-03-31,不要错过了。

限时特惠!1¥ 立即解锁 1Panel 专业版全功能 61 天

作者 HowieHz
2025年3月18日 18:19
前言 活动缘由:1Panel 推出了个官方 APP,已结束公测,进入正式版本。但是这个官方 APP 只有 1Panel 专业版可用,所以 1Panel 官方推出了这个活动。 (这个 APP 对于我个人来说用处不大,毕竟手机浏览器本来就可以完全控制) 1¥ 解锁 1Panel 专业版 61 天全流程

混合云架构下的动态 IPv6 智能加速实践:从家庭网络到全球分发的低成本部署指南

作者 HowieHz
2025年3月16日 17:36
此文也作为本站网络架构分享 图片是完全体展示 图片中“阿里云服务器”可以换为其他任意有公网 IPv4 的云服务器 灵活参考,实际部署可以仅采取其中部分线路 欢迎评论区留言讨论 图像生成源码 @startuml left to right direction actor 访客 as visitor

五周年的一些感悟

作者 hmao
2025年2月22日 09:26
不知不觉,「hmao的日记」即将迎来五周年纪念(从2020年12月开始记录,虽然2020年不计入完整年份,但2 […]
  • ✇刑辩人在路上
  • 成功案例:贪污、受贿、滥用职权罪,无罪辩护意见部分采纳,检察院撤回对滥用职权罪指控
    成功案例:职务犯罪案件有效辩护,被告人涉贪污、受贿、滥用职权罪,无罪辩护意见部分采纳,检察院撤回对滥用职权罪指控。法律文书: 80后刑事律师的办案手记,专注无罪辩护,反抗者的灵魂从未远去。联系方式:liuchen8916@foxmail.com继续阅读《成功案例:贪污、受贿、滥用职权罪,无罪辩护意见部分采纳,检察院撤回对滥用职权罪指控》的全文内容...分类: 成功案例 | Tags: 职务犯罪,变更起诉,撤回起诉,无罪辩护,有效辩护,贪污受贿,滥用职权, | 添加评论(0)还没有评论,您来说两句?相关文章:帮信罪:一种空前可怕的连坐制度 (2023-05-23) 法律文书:李某集资诈骗案刑事申诉状 (2023-07-16) 案件委托-无罪案例-联系我们 (2023-07-16) 支持张庆方律师撕碎勾兑律师画皮 (2024-03-27) 只因拿了三千块扶贫补贴款,老村支书走上漫漫信访申诉路 (2023-11-01) This message is used to verify that this feed (feedId:48270853499278344) belongs t
     

成功案例:贪污、受贿、滥用职权罪,无罪辩护意见部分采纳,检察院撤回对滥用职权罪指控

2025年3月3日 10:46

成功案例:职务犯罪案件有效辩护,被告人涉贪污、受贿、滥用职权罪,无罪辩护意见部分采纳,检察院撤回对滥用职权罪指控。

法律文书:

成功案例:贪污、受贿、滥用职权罪,无罪辩护意见部分采纳,检察院撤回对滥用职权罪指控  职务犯罪 变更起诉 撤回起诉 无罪辩护 有效辩护 贪污受贿 滥用职权 第1张

80后刑事律师的办案手记,专注无罪辩护,反抗者的灵魂从未远去。联系方式:liuchen8916@foxmail.com

继续阅读《成功案例:贪污、受贿、滥用职权罪,无罪辩护意见部分采纳,检察院撤回对滥用职权罪指控》的全文内容...

分类: 成功案例 | Tags: 职务犯罪变更起诉撤回起诉无罪辩护有效辩护贪污受贿滥用职权, | 添加评论(0)

还没有评论,您来说两句?

相关文章:

This message is used to verify that this feed (feedId:48270853499278344) belongs to me (userId:69553665730701312). Join me in enjoying the next generation information browser https://follow.is.
  • ✇刑辩人在路上
  • 一桩涉黑案的去黑“秘闻”
    洺水老王的案子,那时候我还只是个勤勉认真,对法治还抱有些许不切实际幻想的小实习律师。那时候我天真到什么程度吧?老王案子开庭时,我针对两份讯问笔录发表质证意见,笔录显示两名被告人在同一时间不同地点接受同二名侦查人员讯问。我当时笃定的认为,这样的两份笔录,一定会被理所当然的同时排除。理由很简单:世上没有分身术,同一时间同一侦查主体不同的讯问对象,只能导向一个结果——伪造。而检察员只云淡风轻的回应了一句话:这明显属于套用笔录模板后忘记修改时间,充其量属于瑕疵证据,不影响证据效力。既然辩护人提出来了,我们庭后会联系侦查机关出具补正说明。最后的结果,当然是两份笔录同时被法庭采纳,作为定案依据。直到老王案二审时,我还非常幼稚。这种幼稚程度,在今天的我看来,简直有点陌生。二审时我干了件现在的我根本不可能去干的事儿。对着一审庭审笔录,对照判决书,一份份证据比对,看有没有哪份证据属于没有当庭出证质证,而被直接作为裁判证据采纳的。结果还真被我发现了一份,好像是二号人物小李的口供,证据价值倒是寥寥,但是恰好庭审没有展示,而直接出现在了判决书中。我如获至宝,自以为找到了解决案件的金钥匙。我洋洋洒洒给二审法官交
     

一桩涉黑案的去黑“秘闻”

2025年3月3日 10:34

洺水老王的案子,那时候我还只是个勤勉认真,对法治还抱有些许不切实际幻想的小实习律师。

那时候我天真到什么程度吧?老王案子开庭时,我针对两份讯问笔录发表质证意见,笔录显示两名被告人在同一时间不同地点接受同二名侦查人员讯问。我当时笃定的认为,这样的两份笔录,一定会被理所当然的同时排除。理由很简单:世上没有分身术,同一时间同一侦查主体不同的讯问对象,只能导向一个结果——伪造。

而检察员只云淡风轻的回应了一句话:这明显属于套用笔录模板后忘记修改时间,充其量属于瑕疵证据,不影响证据效力。既然辩护人提出来了,我们庭后会联系侦查机关出具补正说明。

最后的结果,当然是两份笔录同时被法庭采纳,作为定案依据。

直到老王案二审时,我还非常幼稚。这种幼稚程度,在今天的我看来,简直有点陌生。

二审时我干了件现在的我根本不可能去干的事儿。对着一审庭审笔录,对照判决书,一份份证据比对,看有没有哪份证据属于没有当庭出证质证,而被直接作为裁判证据采纳的。

结果还真被我发现了一份,好像是二号人物小李的口供,证据价值倒是寥寥,但是恰好庭审没有展示,而直接出现在了判决书中。

我如获至宝,自以为找到了解决案件的金钥匙。我洋洋洒洒给二审法官交了一份法律意见,认为这属于严重的程序违法,应当撤销原判,发回重审。当时的二审法官是老邓,后来办另一起套路贷案时,又跟他打过交道。邓是个技术水准和“国学”素养双双在线的老法官。搞那个案子时,我卯足了劲要去碰瓷。结果老邓全场嬉皮笑脸,我二十年的功力全部打在棉花上,如泥牛入海,被他化解于无形。我简直难以想象,久经考验的邓法官看到我的动议后会作何反应,会不会猛然将刚吞进口中得到枸杞茶喷到刚刚捧起的报纸上。不过最终,善解人意的邓法官还是在判决书中排除了这份未经出示的证据,并礼貌的维持了原判。

说句不谦虚的话,从技术层面来讲,我属于“出道即巅峰”的那类律师。倒不是说我多厉害,而是司法竞技这场游戏,其实没太多技术含量在里头。只要智商在线,又肯钻研,少则仨月,最多半年,每个律师都能充分而彻底的解决任何领域的法律技术问题。

决定一个律师能力上限的,永远是““国学”水平”。

说人话,就是洞穿人性与社会运转底层规则的能力。

要懂人,要懂社会治理。

越是底层的逻辑,越是褪尽伪装,越是看起来不那么高大上,但它偏偏管用。

老王案,就是吃了不懂“国学”的亏。

我以为的沟通效果是,将案件证据薄弱之处暴露出来,让检察院知难而退。而实际的沟通效果则是,我的证据分析恰恰省了检察院的大事儿,连补正提纲都不用列了,我甚至怀疑检察院直接将我的法律意见甩给公安,让公安对照着一一补充。

两退三延后,我错愕的发现,我能找到的漏洞,全他妈被堵上了。连开庭时留给我说得到话都不剩几句了。而这个过程中的罪魁祸首,竟然是我自己!

但老王这个案子最终还是去了黑。

无论何时,无论何地,无论对何人,只要谈起老王这个案子,我永远不会舔着脸说,这个案子去黑,有我的功劳。

去黑,完全是““国学””显灵发挥作用的结果。

涉黑案件,公检法三家都要分别层报至省里审查,审查认为构黑了,才能继续往下走。当时洺水犯了个低级错误,都开过一次庭了,还没往省里汇报。不知道怎么回事,被省里发现了洺水这旮瘩,竟然这么大胆子,不讲政治,妄图先斩后奏。省里责令洺水,立即停止所有司法程序,把卷报过来,接受审查。

案情大概是这样的:

老王干了个加气砖厂。但洺水那地方,交通落后,至今连条高速公路都不通。在洺水建厂,原材料都要从外面通过大卡车运进来。最终的结果是,工地在老王那买块砖,成本反倒比从外地进货还要高。老王为了“垄断”“控制”洺水加气砖市场,派出小弟,把持了几条进入洺水的必经之路。只要一看到进洺水的运砖车,就上去把人挡风玻璃给砸了。

老王的算盘打的噼啪响:你跑车不就为了赚钱吗?你跑一趟洺水能挣几个钱?我砸你一块玻璃,你光修车就得大几百。让你跑一趟赔一趟。时间长了,没人再往洺水跑,岂不是每个人都必须用我老王的砖了?

要我说,给老王定个黑社会,还真不能说冤。

如果洺水县一开始就按正常程序向上层报,省里八成也会同意黑社会的定性。但问题出就出在,洺水不听招呼,自行其是,妄图先斩后奏。这在上级司法机关眼里,是极度不讲政治的行为。

我估计案卷抱到省里,人省里的人根本就没看。本来就是奔着找你洺水的麻烦来的,谁真他妈在意犄角旮旯小县城里一个姓曹的老头是不是真黑社会?直接劈头盖脸熊了洺水一顿,接着给案件定了调儿:不涉黑。就让洺水的人滚回去了。

这就是老王案去黑的全过程。

我看卷细致到连两份笔录的记载时间重叠都给挑出来了,又有什么用?人家公诉人就这还是看你从省城远道而来,高看一眼,还给你弄个补正说明。碰见傲气一点的检察官,都不带正眼瞧你的。

从“国学”角度划分,刑事案件可以分两种。

一种是不体现官方意志的案件。什么诈骗啦、强奸啦、伤害啦。纯粹由于民间纠纷引发,官方至多需要考虑个维稳问题。对于这种案件,自当以解决法律技术问题为主。充其量对方上魔法攻击时,你这边也要适时玩点支的,对冲一下。

另一种则完全是在官方意志主导下的案件。具体来说就是扫黑除恶与反腐败案件。很多律师吐槽,说越是当官的,落马后越是相信组织,迷信关系,言语中颇有不屑之意。律师想挣钱,我能理解。但律师若就此以为,自己真的比当官的高明,那就图样图森破了。解决这两类案件的金钥匙,当然在案件之外。落马官员唯一没有转变过来的观念是,他们已经出局,not on the table,but on the menu 了。

第一类案件,只要解决了技术问题,最后大多都能获得不错的结果。而第二类案件,则是“时”、“势”、“运”缺一不可。

即便让今天的我带着满满的““国学””储备,穿越回去再做一回老王的案件,我就能确保案件同样脱黑吗?

不能。

且不说没有逐级层报这种事儿,律师根本无从得知。

从“国学”的角度讲,同一件事的败露,是上级主动发现,还是有人揭发,处理方式自然不一样。同为揭发,不同的人揭发,所达到的效果也不会一样。

同样是没有层报,一个是省里自行发现,一个是律师跑到省里告状。

处理结果会一样吗?

80后刑事律师的办案手记,专注无罪辩护,反抗者的灵魂从未远去。联系方式:liuchen8916@foxmail.com

继续阅读《一桩涉黑案的去黑“秘闻”》的全文内容...

分类: 故事会 | Tags: 涉黑案件拖黑摘帽有效辩护底层逻辑法律与政治, | 添加评论(4)


最新评论:

相关文章:

This message is used to verify that this feed (feedId:48270853499278344) belongs to me (userId:69553665730701312). Join me in enjoying the next generation information browser https://follow.is.
  • ✇刑辩人在路上
  • 跟牛牛演练了两把如何去邻班找小玩伴
    哈哈是牛牛上幼儿园时交到的好朋友。人的年龄越小,越容易交到交心的朋友。这句话似乎在全年龄段都适用。小学已经上完一个学期了,牛牛常玩的几个玩伴儿,还都是幼儿园同学。她的几个玩伴也是如此,九九跟哈哈关系最好,一逮着机会来我家,俩人就疯跑疯玩,叫都叫不走。哈哈家原先就住在隔壁小区。两个小区只有一二百米的距离,中间隔着一座小体育广场。有一大片空地,一个小足球场和两个小篮球场。两个小区的居民饭后常在楼下小广场遛弯,她俩也经常趁遛弯时,在一起玩耍。去年下半年,哈哈突然搬了家。新家还不近,已经不在现在这个学区了。俩小孩除了能在下课上厕所无意中碰到说两句悄悄话外,在一起玩的机会就很少了。昨天刚接到牛牛,牛牛就扯着我的手,迫不及待的说:刚才放学的路上,我碰见哈哈了,我俩约好了要在小广场玩。我还以为她俩只是约好了某个时间一起到广场去,就问牛牛:那好呀,你们约的什么时间啊?结果牛牛说:就是现在。哈哈正在前面等着我呢。说话间,我便瞅见了哈哈和她奶奶。一老一小果然正站在路口。哈哈踮着脚尖,伸长了脖子,正往人流里张望。于是,我在小广场上吹了近俩小时的寒风。俩小孩儿才恋恋不舍的互相道别。不知道俩小孩在一起又嘀咕了啥
     

跟牛牛演练了两把如何去邻班找小玩伴

2025年2月18日 18:53

哈哈是牛牛上幼儿园时交到的好朋友。

人的年龄越小,越容易交到交心的朋友。这句话似乎在全年龄段都适用。小学已经上完一个学期了,牛牛常玩的几个玩伴儿,还都是幼儿园同学。她的几个玩伴也是如此,九九跟哈哈关系最好,一逮着机会来我家,俩人就疯跑疯玩,叫都叫不走。

哈哈家原先就住在隔壁小区。两个小区只有一二百米的距离,中间隔着一座小体育广场。有一大片空地,一个小足球场和两个小篮球场。

两个小区的居民饭后常在楼下小广场遛弯,她俩也经常趁遛弯时,在一起玩耍。

去年下半年,哈哈突然搬了家。新家还不近,已经不在现在这个学区了。俩小孩除了能在下课上厕所无意中碰到说两句悄悄话外,在一起玩的机会就很少了。

昨天刚接到牛牛,牛牛就扯着我的手,迫不及待的说:刚才放学的路上,我碰见哈哈了,我俩约好了要在小广场玩。

我还以为她俩只是约好了某个时间一起到广场去,就问牛牛:那好呀,你们约的什么时间啊?

结果牛牛说:就是现在。哈哈正在前面等着我呢。

说话间,我便瞅见了哈哈和她奶奶。一老一小果然正站在路口。哈哈踮着脚尖,伸长了脖子,正往人流里张望。

于是,我在小广场上吹了近俩小时的寒风。俩小孩儿才恋恋不舍的互相道别。

不知道俩小孩在一起又嘀咕了啥。牛牛晚上收拾书包时,特意多装了两个本子,说哈哈很喜欢这个本子,要拿两本明天上学送给哈哈。

牛牛很担心自己找不到哈哈。老婆给她支招:你就到她们班门口,直接喊哈哈的名字就行了。

牛牛说:可是我不敢去串班呀。

老婆又说:那你就站在她们班门口,看谁出来上厕所了,让她帮你喊哈哈出来。

牛牛满怀心事的睡觉了。

我倒是老早就把这件事儿给忘了。

倒是牛牛,今天刚一接到手,就跟我说没找到哈哈。

我和老婆都忽略了一个事儿,对于他们这个年龄的老实小孩儿来说,串班儿是件很需要勇气的事儿。

哈哈班在上厕所的必经之路上,牛牛还敢顺路站在她班门口瞅两眼。哈哈压根就不敢往牛牛班这个方向来。

我问牛牛:为啥不敢去,是因为老师不让去吗?

牛牛说:也没说不让去,但是都没人去别的班串。

咱也说不上到底为啥。想想也是,学校,尤其是中小学,其实挺封闭的单元。除了极少数“风流人物”,大部分人从第一天进校门到最后毕业离校,交际圈都不会超出本班。像牛牛和哈哈这样,幼儿园就碰巧在一个班,又格外玩得来,还最终上同一个小学的,毕竟是极少数。大家都不串班,俩小女孩没有先例可供参照,就卡在这一步犯了难。

小孩的心思远比大人想象的要缜密。

俩小孩昨天就约好了,今天下课期间,约在哈哈班门口见面。一下课,哈哈就站在班门口,等着牛牛去找她。

但是俩小孩可能并没有约好具体哪一节课下课,总之,不知道哪个环节出了问题,俩小孩今天一整天都没能碰上面儿。

突然觉得现在的小孩子好可怜,比我们这代人小时候可怜多了。

现在的小孩基本丧失了行动与交际自主权。想跟哪个好朋友见一面,玩上一场,是一件相当不容易的事。我常自诩比较开明的家长,但也绝对不可能允许牛牛跨越哪怕一个路口,独自到朋友家玩。反观我小时候,大街上随处是三三两两插队的小孩儿。我从家里上学路上,刚好经过一个好朋友的家,我经常中午早些出发,路过他家时去他家里玩上一会儿,再一起去学校。

我也搞不清楚问题究竟出在哪里。

是因为现在的城建钢铁森林对小孩子过于不友好?恐怕也不是的。我小时候居住的南阳路一线,近几十年来没什么太大变化。即便让我回到南阳路附近去住,我就敢于放手让小布丁点儿的牛牛自己上好朋友玩吗?肯定还是做不到。

我从老家转学到郑州的第一天上午放学,老师就问了我一嘴,家在哪个方向。我指了指,她就安排说,那你排在这个队伍里。之后便不管了,我自己走了两个路口回了家。放在今天,这事儿简直不敢想象。今天的老师,非把小孩儿交到家长手里,否则宁愿吃点亏加班守着,也不敢放小孩自己回家。哪怕家距离学校只有二百米的距离。

看着牛牛为难又落寞的神情,我决定带她演练一番。

我让她站定在原地,用手对空气比划一番,对她说:现在假装这是哈哈班里的门,假装你是哈哈,正坐在座位上,我是你,你就像我一样,走到哈哈班门口,把脑袋探进去,大喊“哈哈”,哈哈听到之后,就会出来见你了。

牛牛被我的样子逗笑了:还有其他办法没?

我说:有啊。你还可以先站在她们班门口。现在假装你是下课出来上厕所的小孩儿,我是你。我现在拦住你,让你帮我回班喊一下哈哈。这样你们不就也见着面儿了?

牛牛若有所思片刻,说:算了。我还是直接喊坐在她们班门口的小孩儿帮我喊吧。

我一屁股坐在路牙石上,对牛牛说:现在假装这棵树是哈哈班的门,假装我是坐在坐在门口的小孩,现在你来试一下让我帮你叫哈哈。

牛牛却拽起我的手就走,嘴上嚷嚷:快走啊爸!别这样!你这样太幼稚了!

我又问牛牛:明天就像刚才那样找哈哈,知道了吗?

牛牛说:知道了。

我突然变成了全天下爱唠叨的父母样子,接着安排道:哈哈要是问你昨天咋没来找她,你就跟她说,我昨天来找你了,但是没找到。

牛牛点点头。

希望今天的演练有成效,明天俩小人能顺利接上头~

80后刑事律师的办案手记,专注无罪辩护,反抗者的灵魂从未远去。联系方式:liuchen8916@foxmail.com

继续阅读《跟牛牛演练了两把如何去邻班找小玩伴》的全文内容...

分类: 日记随想 | Tags: | 添加评论(6)


最新评论:

  • 2025-03-03 10:40:06 AM,李白拿酒来 : 还是很难绕过父母
  • 2025-03-03 10:39:41 AM,李白拿酒来 : 嗯嗯,第二天成功交接了~
  • 2025-03-03 10:39:18 AM,李白拿酒来 : 倒也是,现在出事都是全国人尽皆知
  • 2025-02-19 17:11:48 PM,keyle : 我小侄女都是电话**,互相沟通,然后让父母约时间
  • 2025-02-19 16:42:36 PM,进击的学霸 : “牛牛却拽起我的手就走,嘴上嚷嚷:快走啊爸!别这样!你这样太幼稚了!” 哈哈这句太好玩了,反过来被小孩子说幼稚。希望他们可以成功汇合,好多事情其实没有想象的那么难,关键是能有勇气去做第一次
  • 2025-02-19 12:40:24 PM,大致 : 以前也有很多小孩出事的,只不过信息流通速度和范围都不行。不像现在,哪里出事,2小时之内全国人民就都知道了。

相关文章:

This message is used to verify that this feed (feedId:48270853499278344) belongs to me (userId:69553665730701312). Join me in enjoying the next generation information browser https://follow.is.
  • ✇游钓四方的博客
  • 骑行开封游钓四方的博客
    我对于开封的印象,还停留在开封府尹·包拯。处于好奇和无处可去的想法,周六早上吃完饭,说走就走了 这里就到达开封了开封·鼓楼,郑开大道的路上很轻松,室外温度17°+,小风微微的吹着,不冷不热好不痛快 在郑开大道单飞的过程中偶遇骑友,王哥是开封本地的,骑行的路上跟我聊开封哪里好玩,哪里最具性价比,把我领进开封鼓楼后,又带我在景区逛了一圈带我认路,在此感谢大哥 早饭吃的比较仓促,真的很饿,在书店街附近买了些吃的 本来是想在开封呆一天,晚上去清明上河园玩,想到公司有事就提前回去了,怕耽误明天的行程 这次跨市骑行急了一些,时间太紧张了!再过几天休息,我想回一次家,骑行约200KM
     

骑行开封

2025年2月20日 16:14

我对于开封的印象,还停留在开封府尹·包拯。处于好奇和无处可去的想法,周六早上吃完饭,说走就走了

到达开封鼓楼

这里就到达开封了开封·鼓楼,郑开大道的路上很轻松,室外温度17°+,小风微微的吹着,不冷不热好不痛快

Strava记录

在郑开大道单飞的过程中偶遇骑友,王哥是开封本地的,骑行的路上跟我聊开封哪里好玩,哪里最具性价比,把我领进开封鼓楼后,又带我在景区逛了一圈带我认路,在此感谢大哥

与王哥的合照

早饭吃的比较仓促,真的很饿,在书店街附近买了些吃的

干饭

本来是想在开封呆一天,晚上去清明上河园玩,想到公司有事就提前回去了,怕耽误明天的行程

鼓楼合影

郑开大道

这次跨市骑行急了一些,时间太紧张了!再过几天休息,我想回一次家,骑行约200KM

Strava记录

❌
❌