使用Apiflash+PIL截取Twitter单条推文时底部裁剪高度可变问题求教
解决方案
方案1:调用Apiflash接口时直接指定截取推文元素(首选,无需后续裁剪)
Apiflash原生支持通过element参数传递CSS选择器,仅截取对应元素的内容,完全不需要手动计算裁剪边界。Twitter单条推文的固定唯一选择器为article[data-testid="tweet"],直接将该参数加到请求中即可精准得到仅含单条推文的截图。
修改后的代码如下:
from urllib.parse import urlencode from urllib.request import urlretrieve def screenshot(url, cond): params = urlencode(dict( access_key="api", url=url, element="article[data-testid='tweet']", # 新增元素选择器参数 format="jpg" )) urlretrieve("https://api.apiflash.com/v1/urltoimage?" + params, "screenshot.jpg")
这个方案不需要后续任何裁剪操作,返回的图片就是目标单条推文内容,适配任意长度的推文。
方案2:如果需要保留现有逻辑,通过PIL自动检测底部边界
如果必须先截全图再裁剪,可以通过像素扫描自动定位推文底部边界:
你固定的左右边界内,推文内容和下方的空白/回复区背景色有明确差异,从top值开始向下逐行扫描像素,当检测到连续多行的像素都和页面背景色一致时,就可以判定这个位置是推文的底部边界。
参考代码如下:
from urllib.parse import urlencode from urllib.request import urlretrieve from PIL import Image def screenshot(url, cond): params = urlencode(dict(access_key="api", url=url)) urlretrieve("https://api.apiflash.com/v1/urltoimage?" + params, "screenshot.jpg") image = Image.open(r'screenshot.jpg') image = image.convert("RGB") left = 605 top = 60 right = 1200 # 自动检测底部边界 bg_color = image.getpixel((left-10, top)) # 取推文左侧的背景色作为参考 bottom = image.height continuous_blank_rows = 0 required_blank_rows = 20 # 连续20行都是背景色就判定到了推文底部,可根据实际调整 for y in range(top, image.height): # 检查当前行在左右边界内的所有像素是否都是背景色 is_blank = True for x in range(left, right): if image.getpixel((x,y)) != bg_color: is_blank = False break if is_blank: continuous_blank_rows +=1 if continuous_blank_rows == required_blank_rows: bottom = y - required_blank_rows break else: continuous_blank_rows = 0 image = image.crop((left, top, right, bottom)) image.save('screenshot.jpg')
内容的提问来源于stack exchange,提问作者HadiH2o
相关产品推荐
相关产品推荐

