[Python] RSS 文字转图片并单独抓取url以文字输出

为go-cqhttp的使用写的文字转图片功能。但是又考虑到网页链接要OCR识别十分麻烦,所以单独抓取url以文字输出。
在实际操作的过程中遇到了一些问题。因为rss抓取的字符串中,经常会包含换行符\n,导致图片错位。

我个人推断是因为我为了美观,所以在设置line_height时,加入了额外的间距,但\n只会根据字体默认间距换行,导致排版错误。最简单的解决办法就是用re.sub去除字符串中的所有\n,只是会影响分段。想要保留分段,就要在字符串分行的部分中,识别\n,用lines.append分行并跳过\n的写入。但是在for循环中print(word)检验时发现,无论是re.sub('\\n','\\\n',text)还是re.sub('\\n','\\\\n',text),都会被识别为换行符。没有办法,找了个生僻字替换,希望有人能给出正规的解决办法。

# coding=UTF8
import re
import time
import base64
from PIL import Image, ImageFont, ImageDraw


#字体设置
fontSize = 28
fontPath = r"C:\Windows\Fonts\simhei.ttf"
font = ImageFont.truetype(fontPath, fontSize)

#字符串分行
text = rss_str
lines = []
line = u''
text = re.sub('\\n', '骉', text)
for word in text:
    if word == '骉':
        lines.append(line)
        line = u''
        continue
    if font.getsize(line + word)[0] >= 480:
        lines.append(line)
        line = u''
        line += word
    else:
        line = line + word
lines.append(line)

#画布设置
line_height = (font.getsize(text)[1]) + 15
img_height = line_height * (len(lines) + 1)
im = Image.new("RGB", (540, line_height * (len(lines) + 1)), (255, 255, 255))

#在画布上写字
dr = ImageDraw.Draw(im)
x, y = 30, 30
for line in lines:
    dr.text((x, y), line, font=font, fill="#696969")
    y += line_height
timeline = time.strftime('%Y%m%d%H%M%S', time.localtime(time.time()))
im.save("E:\RSS\%s.JPEG" % timeline, 'JPEG', subsampling=0, quality=100)

#将图片转换为base64并包装为go-cqhttp的图片输出格式
with open("E:\RSS\%s.JPEG" % timeline,"rb") as f:
    img_data = f.read()
    base64_data = base64.b64encode(img_data)
    base64_str = str(base64_data, "utf-8")
    base_str = 'base64://' + base64_str
    cq_img ='[CQ:image,file=' + base_str + ',cache=1]'
    input_info = cq_img

#抓取url,这是我在网上找到的一个正则,暴力但是非常有效,比一些package还好
URL_REGEX = r"""(?i)\b((?:https?:(?:/{1,3}|[a-z0-9%])|[a-z0-9.\-]+[.](?:com|net|org|edu|gov|mil|aero|asia|biz|cat|coop|info|int|jobs|mobi|museum|name|post|pro|tel|travel|xxx|ac|ad|ae|af|ag|ai|al|am|an|ao|aq|ar|as|at|au|aw|ax|az|ba|bb|bd|be|bf|bg|bh|bi|bj|bm|bn|bo|br|bs|bt|bv|bw|by|bz|ca|cc|cd|cf|cg|ch|ci|ck|cl|cm|cn|co|cr|cs|cu|cv|cx|cy|cz|dd|de|dj|dk|dm|do|dz|ec|ee|eg|eh|er|es|et|eu|fi|fj|fk|fm|fo|fr|ga|gb|gd|ge|gf|gg|gh|gi|gl|gm|gn|gp|gq|gr|gs|gt|gu|gw|gy|hk|hm|hn|hr|ht|hu|id|ie|il|im|in|io|iq|ir|is|it|je|jm|jo|jp|ke|kg|kh|ki|km|kn|kp|kr|kw|ky|kz|la|lb|lc|li|lk|lr|ls|lt|lu|lv|ly|ma|mc|md|me|mg|mh|mk|ml|mm|mn|mo|mp|mq|mr|ms|mt|mu|mv|mw|mx|my|mz|na|nc|ne|nf|ng|ni|nl|no|np|nr|nu|nz|om|pa|pe|pf|pg|ph|pk|pl|pm|pn|pr|ps|pt|pw|py|qa|re|ro|rs|ru|rw|sa|sb|sc|sd|se|sg|sh|si|sj|Ja|sk|sl|sm|sn|so|sr|ss|st|su|sv|sx|sy|sz|tc|td|tf|tg|th|tj|tk|tl|tm|tn|to|tp|tr|tt|tv|tw|tz|ua|ug|uk|us|uy|uz|va|vc|ve|vg|vi|vn|vu|wf|ws|ye|yt|yu|za|zm|zw)/)(?:[^\s()<>{}\[\]]+|\([^\s()]*?\([^\s()]+\)[^\s()]*?\)|\([^\s]+?\))+(?:\([^\s()]*?\([^\s()]+\)[^\s()]*?\)|\([^\s]+?\)|[^\s`!()\[\]{};:\'\".,<>?«»“”‘’])|(?:(?<!@)[a-z0-9]+(?:[.\-][a-z0-9]+)*[.](?:com|net|org|edu|gov|mil|aero|asia|biz|cat|coop|info|int|jobs|mobi|museum|name|post|pro|tel|travel|xxx|ac|ad|ae|af|ag|ai|al|am|an|ao|aq|ar|as|at|au|aw|ax|az|ba|bb|bd|be|bf|bg|bh|bi|bj|bm|bn|bo|br|bs|bt|bv|bw|by|bz|ca|cc|cd|cf|cg|ch|ci|ck|cl|cm|cn|co|cr|cs|cu|cv|cx|cy|cz|dd|de|dj|dk|dm|do|dz|ec|ee|eg|eh|er|es|et|eu|fi|fj|fk|fm|fo|fr|ga|gb|gd|ge|gf|gg|gh|gi|gl|gm|gn|gp|gq|gr|gs|gt|gu|gw|gy|hk|hm|hn|hr|ht|hu|id|ie|il|im|in|io|iq|ir|is|it|je|jm|jo|jp|ke|kg|kh|ki|km|kn|kp|kr|kw|ky|kz|la|lb|lc|li|lk|lr|ls|lt|lu|lv|ly|ma|mc|md|me|mg|mh|mk|ml|mm|mn|mo|mp|mq|mr|ms|mt|mu|mv|mw|mx|my|mz|na|nc|ne|nf|ng|ni|nl|no|np|nr|nu|nz|om|pa|pe|pf|pg|ph|pk|pl|pm|pn|pr|ps|pt|pw|py|qa|re|ro|rs|ru|rw|sa|sb|sc|sd|se|sg|sh|si|sj|Ja|sk|sl|sm|sn|so|sr|ss|st|su|sv|sx|sy|sz|tc|td|tf|tg|th|tj|tk|tl|tm|tn|to|tp|tr|tt|tv|tw|tz|ua|ug|uk|us|uy|uz|va|vc|ve|vg|vi|vn|vu|wf|ws|ye|yt|yu|za|zm|zw)\b/?(?!@)))"""

urls = re.findall(URL_REGEX,rss_str)
for url in urls:
    input_info = input_info + '\n' + url

最后根据需求选择怎么把代码部分包装成函数就行。

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值