前往小程序,Get更优阅读体验!
立即前往
首页
学习
活动
专区
工具
TVP
发布
社区首页 >专栏 >Serverless-实现bing每日壁纸API(一)

Serverless-实现bing每日壁纸API(一)

原创
作者头像
Thor
修改2020-05-18 11:14:47
8400
修改2020-05-18 11:14:47
举报
文章被收录于专栏:云上服务云上服务

serverless函数的开发方式很适合用来实现一些简单的小功能,比如接下来要做的这个,抓取bing搜索的每日壁纸图片,功能非常的简单:

准备工作

选择使用腾讯云的云函数功能来做开发,所以需要按照腾讯云的文档来安装好相应的工具:

  1. scf 命令行工具: https://cloud.tencent.com/document/product/583/33445
  2. vscode插件:https://cloud.tencent.com/document/product/583/38106

安装和使用过程,官方文档很详细了,这里不再做描述。

直接贴代码

python实现,index.py:

代码语言:txt
复制
# -*- coding: utf8 -*-
from os import getenv
import requests
import json
#此处有坑,云上运行的时候是qcloud_cos_v5
from qcloud_cos_v5 import CosConfig
from qcloud_cos_v5 import CosS3Client
from serverless_db_sdk import database

def main_handler(event, context):
    #请求bing的api,获取壁纸信息,参数n=1控制每次只取最近的一条
    r = requests.get("https://cn.bing.com/HPImageArchive.aspx?format=js&idx=0&n=1")
    r = r.json()
    for row in r['images']:
        print(row)
        #先下载
        download('https://cn.bing.com{}'.format(row['url']), row['fullstartdate'])
        #数据库记录信息
        save2db(row)
    return("OK")

def download(url, startdate):
    # 下载回来
    r = requests.get(url)
    tmp_file = "/tmp/" + startdate + ".png"
    with open(tmp_file, 'wb') as f:
        f.write(r.content)

    # 上传到cos
    secret_id = getenv('COS_SECRETID')
    secret_key = getenv('COS_SECRETKEY')
    config = CosConfig(Region="ap-guangzhou",
                       SecretId=secret_id, SecretKey=secret_key)
    cos_client = CosS3Client(config)
    res_cos = cos_client.put_object_from_local_file(
        Bucket="bing-1256668370",
        LocalFilePath=tmp_file,
        Key='{}.png'.format(startdate))
    return res_cos


def save2db(row):
    sql_template = """INSERT INTO `bing`.`wallpaper` (`startdate`, `fullstartdate`, `enddate`, `url`,`urlbase`,
    `copyright`,`copyrightlink`,`title`,`quiz`,`hsh`) VALUES  (%s,%s,%s,%s,%s,%s,%s,%s,%s,%s)"""
    connection = database("BING").connection(autocommit=False)
    try:
        cursor = connection.cursor()
        cursor.execute(sql_template, (row['startdate'], row['fullstartdate'], row['enddate'], row['url'],
                                      row['urlbase'], row['copyright'], row['copyrightlink'], row['title'],
                                       row['quiz'], row['hsh']))
        connection.commit()
    finally:
        connection.close()
    

云函数的template.yaml,这里配置了数据库和cos的参数

代码语言:txt
复制
Resources:
  default:
    Type: TencentCloud::Serverless::Namespace
    fetch_bing_wallpicture:
      Properties:
        CodeUri: .
        Description: 抓取bing每日一图
        Environment:
          Variables:
            DB_BING_DATABASE: bing
            DB_BING_HOST: ***
            DB_BING_PASSWORD: ***
            DB_BING_PORT: "***"
            DB_BING_USER: bing
            DB_DEFAULT: BING
            COS_SECRETID: ***
            COS_SECRETKEY: ***
        Events: {}
        Handler: index.main_handler
        MemorySize: 128
        Runtime: Python3.6
        Timeout: 3
        VpcConfig:
          SubnetId: ***
          VpcId: ***
      Type: TencentCloud::Serverless::Function

上传到腾讯云之后,在腾讯云的控制台上配置触发方式为每天定时执行,这样就会每天抓取到最新的bing壁纸了

需要注意的问题

  1. 腾讯云的vscode插件执行的时候不能注入环境变量,也就是说配置在template文件中的数据库配置,无法被读取,但是通过scf的命令是可以正常读取的:
代码语言:txt
复制
echo '{"test":"value"}' | scf native invoke

2. cos的库版本云端运行的时候是qcloud_cos_v5,所以本地安装的时候需要注意,这里我在本地一开始安装的就不是这个版本,本地调试通过,到云端就会报错。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

原创声明:本文系作者授权腾讯云开发者社区发表,未经许可,不得转载。

如有侵权,请联系 cloudcommunity@tencent.com 删除。

评论
登录后参与评论
0 条评论
热度
最新
推荐阅读
目录
  • 准备工作
  • 直接贴代码
  • 需要注意的问题
相关产品与服务
领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档