并不复杂,采用https://ip.zxinc.org/api.php的ip地址api,虽然比较慢,但能用。

2020.10.15 更新

前几天签名图的访问量(有记录以来)超过了一万次,昨天抽时间把代码重写了一遍,两年多以前的代码真的是惨不忍睹现在的也好不到哪里去,基本上就是沿着之前的思路,改了几个变量名,增强了可读性,在外表的功能性上来看和以前还应该是一样的。

立个flag:过几天加上随机图功能 然后仔细介绍一下


#!python3

import io
import json
import random
import time

import requests
from flask import (Flask, flash, redirect, render_template, request,send_from_directory, url_for)
from flask_redis import FlaskRedis
from PIL import Image, ImageDraw, ImageFont
from user_agents import parse

app = Flask(__name__)
app.config['REDIS_URL'] = "redis://:dogcatdog@127.0.0.1:6542/0"
rc = FlaskRedis(app, decode_responses=True)
basdog = Image.open('bd.png', 'r')


def get_number():
    dog_number = rc.incr('dogg')
    return dog_number


def rndColor2():
    return (random.randint(1, 144), random.randint(1, 120), random.randint(1, 100))


def get_ip_info(dogip):
    canshu = {'ip': dogip, 'type': 'json'}
    r = requests.get('https://ip.shanshan-business.com/api.php', params=canshu)
    resd = (r.content.decode('utf8'))
    res = json.loads(resd[1:])
    if res['code'] != 0:
        fu = [' ', ' ']
        return fu
    dog_location = res['data']['location']
    dog_ip_fw = '{} - {}'.format(res['data']['ip']['start'], res['data']['ip']['end'])
    return [dog_location, dog_ip_fw]


def dog_pic(ip, refer, ua):
    """
    docstring
    """
    [dog_location, dog_ip_fw] = get_ip_info(ip)
    dog_uap = parse(str(ua))
    dog_os = dog_uap.get_os()
    dog_browser = dog_uap.get_browser()
    dog_device = dog_uap.get_device()
    dog_num = get_number()
    dog_text_1 = '只争朝夕,不负韶华。 IP段 : {}'.format(dog_ip_fw)
    dog_text_2 = 'IP地址: {}  {}'.format(ip, dog_location)
    dog_text_3 = '{}'.format(refer)
    dog_text_4 = '浏览器: {} OS: {} 设备: {}'.format(
        dog_browser, dog_os, dog_device)
    dog_text_5 = '已被访问{}次  北京时间:{}'.format(dog_num, time.ctime())
    dog_text_6 = '为庆祝有记录以来访问量已经突破十万次,本签名图即将改版!'
    # 开始画图了
    image = basdog.copy()
    font1 = ImageFont.truetype('/home/yu/.local/share/fonts/仿宋_GB2312.ttf', 14)
    font2 = ImageFont.truetype('/home/yu/.local/share/fonts/仿宋_GB2312.ttf', 20)
    draw = ImageDraw.Draw(image)
    draw.text((10, 30), dog_text_1, font=font2, fill=(255, 0, 0))
    draw.text((10, 70), dog_text_2, font=font2, fill=(0, 0, 0))
    draw.text((10, 110), dog_text_3, font=font1, fill=rndColor2())
    draw.text((10, 150), dog_text_4, font=font2, fill=rndColor2())
    draw.text((10, 180), dog_text_5, font=font2, fill=rndColor2())
    draw.text((10, 210), dog_text_6, font=font1, fill=rndColor2())
    buf = io.BytesIO()
    image.save(buf, 'jpeg')
    image.close()
    buf_str = buf.getvalue()
    response = app.make_response(buf_str)
    response.headers['Content-Type'] = 'image/jpeg'
    return response


@app.route('/')
def index():
    dog_ip = request.remote_addr
    dog_ua = request.user_agent
    dog_uap = parse(str(dog_ua))
    dog_os = dog_uap.get_os()
    dog_browser = dog_uap.get_browser()
    dog_device = dog_uap.get_device()
    dog_refer = request.referrer
    [dog_location, dog_ip_fw] = get_ip_info(dog_ip)
    dog_num = get_number()
    dog_text = '只争朝夕 不负韶华  <br>{}  {} <br>Hits: {}<br>浏览器: {} OS: {} 设备: {}<br>{}<br>{}\n'.format(dog_ip, dog_location, dog_num, dog_browser, dog_os, dog_device, dog_refer, dog_ip_fw)
    return dog_text


@app.route('/img.jpg')
def img():
    return dog_pic(str(request.remote_addr), str(request.referrer), request.user_agent)


if __name__ == "__main__":
    app.run(debug=True)