python 날씨 인터페이스 가 져 오기 지정 한 위 챗 친구 에 게 일기예보 보 내기

먼저 효과 그림 보기:

사용 한 모듈:
  • PyMySQL
  • requests
  • threading
  • wxpy
  • 위의 예 시 를 실현 하려 면 먼저 두 개의 큰 부분 이 있다.
  • 날씨 정보 얻 기
  • 위 챗 을 통 해 날씨 메 시 지 를 보 냅 니 다.
  • 날씨 정 보 를 얻 는 데 는 몇 가지 작은 주의 점 이 포함 되 어 있다.
    날씨 정보 가 져 오기
  • 날씨 정 보 를 얻 는 인터페이스
  • 날씨 정 보 를 얻 은 도시
  • 소재 도시 코드
  • 획득
    만약 에 우리 가 여러 사람 에 게 날씨 상황 을 보 내 면 이 몇 사람 이 서로 다른 도시 에서 온다 면 우 리 는 매번 도시 이름 을 입력 한 다음 에 도시 코드 를 찾 은 다음 에 인 터 페 이 스 를 방문 하여 날씨 상황 을 얻 을 수 없다.그러면 매우 번 거 로 울 것 이다.그래서 우 리 는 도시 이름과 도시 코드 를 일일이 대응 하 는 것 을 고려 해 야 한다.먼저 생각 나 는 데이터 구 조 는 바로 사전 이기 때문에 우 리 는 이 정 보 를 한 사전 에 저장 한 다음 에 한 파일 에 오래 지속 시 킬 수 있다.그러면 매우 편리 하 다.
    우선 최신 city 표를 가 져 옵 니 다.이 시 계 는 list 형식 입 니 다.대체적으로 다음 과 같 습 니 다.
    
    [
     {
      "id": 1,
      "pid": 0,
      "city_code": "101010100",
      "city_name": "  ",
      "post_code": "100000",
      "area_code": "010",
      "ctime": "2019-07-11 17:30:06"
     },
     {
      "id": 2,
      "pid": 0,
      "city_code": "",
      "city_name": "  ",
      "post_code": null,
      "area_code": null,
      "ctime": null
     }
    ]
    우 리 는 간단하게 붙 여 넣 고 복사 해서 빈 목록 에 넣 습 니 다.다음 과 같이 모든 도시 정 보 를 목록 citycode 에 넣 습 니 다.
    
    citycode = [
     {
      "id": 1,
      "pid": 0,
      "city_code": "101010100",
      "city_name": "  ",
      "post_code": "100000",
      "area_code": "010",
      "ctime": "2019-07-11 17:30:06"
     },
    ...
    ...
    ...
    ...
    ...
    ...
     {
      "id": 2,
      "pid": 0,
      "city_code": "None",
      "city_name": "  ",
      "post_code": "null",
      "area_code": "null",
      "ctime": "null"
     }
    ]
    
    cityinfo = {}
    #           json   
    with open('city_for_code.json','w',encoding='utf-8') as f:
      for i in citycode:
        name = i["city_name"]
        code = i["city_code"]
        cityinfo[name] = code
      f.write(str(cityinfo))
    
    #       
    with open('city_for_code.json','r+',encoding='utf-8') as file:
      data_dst = file.readlines()
      d = eval(data_dst[0])
    그리고 우리 가 필요 로 하 는 cityname 과 citycode 이 두 필드 를 꺼 내 면 됩 니 다.그리고 파일 에 기록 합 니 다.읽 으 면 위의 방법 으로 읽 습 니 다.주의해 야 할 것 은 open()방법 으로 파일 을 읽 고 얻 은 내용 은 목록 입 니 다.eval()방법 을 통 해 dict 형식 으로 전환 해 야 합 니 다.
    이것 은 cityname 과 citycode 를 파일 에 넣 는 방법,그리고 데이터베이스 에 넣 을 수도 있 습 니 다.여 기 는 MySQL 을 예 로 들 어 PyMySQL 모듈 을 설치 합 니 다.
    
    import pymysql
    
    db_parames = {
      'host': 'localhost',
      'user': 'root',
      'password': '123456',
      'database': 'city_code_info'
    }
    #     
    conn = pymysql.connect(**db_parames)
    
    #      ,           
    cursor = conn.cursor()
    
    #   ,   
    cursor.execute("DROP TABLE IF EXISTS city_code")
    
    #    
    create_table_sql = """CREATE TABLE `city_code` (
     `city_name` varchar(20) DEFAULT NULL,
     `city_code` varchar(25) DEFAULT NULL
    ) ENGINE=InnoDB DEFAULT CHARSET=utf8mb4;
    """
    #  
    cursor.execute(create_table_sql)
    
    #    
    with open('city_for_code.json','r+',encoding='utf-8') as f:
      origin_data = f.readlines()
      current_data = eval(origin_data[0])  #          ,        
      #print(current_data.get('  ','Not Exists.'))
      for name, code in current_data.items():
        sql = """INSERT INTO city_code(city_name, city_code) VALUES ('%s', '%s')""" % (name, code)
        try:
          cursor.execute(sql)
        except:
          conn.rollback()
      conn.commit()
      conn.close()
    이 python 프로그램 을 실행 하면 파일 에 있 는 도시 이름과 도시 코드 를 라 이브 러 리 에 저장 할 수 있 습 니 다.물론 우 리 는 도시 이름과 도시 코드 를 직접 얻 은 다음 에 파일 의 지속 화 단 계 를 뛰 어 넘 고 이 두 필드 를 꺼 내 저장 할 수 있 습 니 다.그러나 코드 를 많이 연습 하고 많이 써 야 한 다 는 것 을 고려 하여 이 를 들 었 습 니 다.
    다음은 도시 이름 을 입력 하면 도시 코드 를 얻 을 수 있 는 코드 블록 입 니 다.
    
    import pymysql
    
    def get_city_code(city_name):
      db_parames = {
      'host': 'localhost',
      'user': 'root',
      'password': '123456',
      'database': 'city_code_info'
      }
      #     
      conn = pymysql.connect(**db_parames)
    
      #      ,           
      cursor = conn.cursor()
    
      #      
      select_sql = "SELECT * FROM city_code where city_name='%s'"%(city_name)
      try:
        cursor.execute(select_sql)
        result = cursor.fetchall()
        for row in result:
          city_code = row[1]
        return city_code
      except:
        return "Error: unable fetch data!"
    그 다음 에 입력 한 도시 코드 에 따라 날씨 상황 을 얻 습 니 다.
    
    import requests
    
    def get_weather(city_name,get_date_time=3):
      city_code = get_city_code(city_name)
      url = 'http://t.weather.sojson.com/api/weather/city/%s'%(city_code)
      header = {
      'user-agent': 'Mozilla/5.0 (Windows NT 10.0; WOW64) AppleWebKit/537.36 (KHTML, like Gecko) Chrome/74.0.3729.169 Safari/537.36'
      }
      response = requests.get(url,header)
      response.encoding = 'utf-8'
      weather = response.json()
      day = {1: '  ', 2: '  ', 3: '   '}
      weather_lst = []
      for num in range(get_date_time):
        City = weather["cityInfo"]["city"]
        Weatherganmao = weather["data"]["ganmao"]
        Weatherquality = weather["data"]["quality"]
        Weathershidu = weather["data"]["shidu"]
        Weatherwendu = weather["data"]["wendu"]
        Weatherpm25 = str(weather["data"]["pm25"])
        Weatherpm10 = str(weather["data"]["pm10"])
        Dateymd = weather["data"]["forecast"][num]["ymd"]
        Dateweek = weather["data"]["forecast"][num]["week"]
        Sunrise = weather["data"]["forecast"][num]["sunrise"]
        Sunset = weather["data"]["forecast"][num]["sunset"]
        Windfx = weather["data"]["forecast"][num]["fx"]
        Windf1 = weather["data"]["forecast"][num]["fl"]
        Weathertype = weather["data"]["forecast"][num]["type"]
        Weathernotice = weather["data"]["forecast"][num]["notice"]
        Weatherhigh = weather["data"]["forecast"][num]["high"]
        Weatherlow = weather["data"]["forecast"][num]["low"]
        if num == 0:
          result = '      ' + '
    ' \ + ' : ' + Dateymd + ' ' + Dateweek + ' ' + City + '
    ' \ + ' : ' + Weathertype + ' ' + Windfx + ' ' + Windf1 + ' ' + Weathernotice + '
    ' \ + ' : ' + Weatherwendu + '℃' + '
    ' \ + ' : ' + Weathershidu + '
    ' \ + ' : ' + Weatherlow + '' + '~' + '' + Weatherhigh + '
    ' \ + ' : ' + 'PM2.5: ' + Weatherpm25 + ' ' + 'PM10: ' + Weatherpm10 + '
    ' \ + ' : ' + Weatherquality + '
    ' \ + ' : ' + Sunrise + '
    ' \ + ' : ' + Sunset + '
    ' \ + ' : ' + Weatherganmao else: which_day = day.get(num,' ') result = '
    ' + which_day + ' ' + ' ' + '
    ' \ + ' : ' + Dateymd + ' ' + Dateweek + ' ' + City + '
    ' \ + ' : ' + Weathertype + ' ' + Windfx + ' ' + Windf1 + ' ' + Weathernotice + '
    ' \ + ' : ' + Weatherlow + '' + '~' + '' + Weatherhigh + '
    ' \ + ' : ' + Sunrise + '
    ' \ + ' : ' + Sunset + '
    ' \ + ' : ' + Weatherganmao weather_lst.append(result) weather_str = '' # , , , 。 for msg in weather_lst: weather_str += msg + '
    ' return weather_str
    다음은 위 챗 메시지 입 니 다.
    
    from wxpy import *
    
    def send_wx(city_name, who):
      bot = Bot(cache_path=True)
      #bot = Bot(console_qr=2, cache_path='botoo.pkl')
      my_friend = bot.friends().search(who)[0]
      msg = get_weather(city_name)
      try:
        my_friend.send(msg)
      except:
        my_friend = bot.friends().search('fei')[0]
        my_friend.send(u"    ")
    그런 후에 우 리 는 시간 을 두 고 한 번 씩 타 이 머 를 써 야 한다.
    
    from threading import Timer
    
    def auto_send():
      city_name = '        '
      friend_list = ['     ']
    
      for who in friend_list:
        send_wx(city_name,who)
      global timer
      timer = Timer(1,auto_send)
      timer.start()
    마지막 실행 프로그램
    
    if __name__ == '__main__':
      timer = Timer(1,auto_send)
      timer.start()
    이상 은 python 에서 날씨 인 터 페 이 스 를 가 져 와 지 정 된 위 챗 친구 에 게 일기예보 의 상세 한 내용 입 니 다.python 에서 날씨 인 터 페 이 스 를 가 져 오 는 데 관 한 자 료 는 다른 관련 글 을 주목 하 십시오!

    좋은 웹페이지 즐겨찾기