精品欧美一区二区三区在线观看 _久久久久国色av免费观看性色_国产精品久久在线观看_亚洲第一综合网站_91精品又粗又猛又爽_小泽玛利亚一区二区免费_91亚洲精品国偷拍自产在线观看 _久久精品视频在线播放_美女精品久久久_欧美日韩国产成人在线

Java/Go/Python 調用企微API主動發送外部群消息:核心技巧+避坑指南

發布于 2025-11-21 15:19
瀏覽
0收藏

企業微信外部群消息推送是ToB業務觸達客戶的核心場景,但企微API對權限、格式、頻率都有嚴格限制,不同語言開發時還會遇到各自的適配問題。本文結合實戰經驗,拆解Java/Go/Python三種主流語言調用企微API主動發外部群消息的核心技巧、通用避坑點,以及各語言專屬優化方案。

一、通用前置:企微API發外部群消息的核心前提

無論用哪種語言,先搞定這3個基礎(踩坑重災區):

1. 權限與身份驗證

  • 必須具備的權限
  • 應用需開啟“客戶聯系-外部群聊”權限(企微管理后臺→應用管理→自建應用→權限配置);
  • 發送賬號需是外部群的“群主/群管理員”,且應用已授權該賬號的“外部聯系讀寫權限”;
  • 外部群需是“客戶群”(普通外部群無法通過API推送,需通過企微客戶端/客戶聯系能力創建)。
  • AccessToken獲取: 所有API調用依賴??access_token??(有效期2小時),需單獨維護緩存(禁止每次請求都獲取,企微限制接口調用頻率),失效后重新調用??https://qyapi.weixin.qq.com/cgi-bin/gettoken??獲取。

2. 消息格式規范

  • 支持類型:文本、圖片、鏈接、小程序、模板消息等(外部群不支持視頻/文件等大附件);
  • 核心參數:
  • ??chatid??:外部群唯一標識(需通過??獲取外部群列表??接口獲取,禁止手動拼接/猜測);
  • ??msgtype??:消息類型(如??text??/??link??);
  • ??agentid??:自建應用的AgentID(需與access_token對應)。

3. 頻率限制

  • 單應用單日發送外部群消息上限:默認2000條(可在企微管理后臺提升,但需審核);
  • 單群每分鐘最多推送5條消息,避免觸發限流(返回429錯誤)。

二、各語言實戰技巧+代碼示例

(一)Java:高可用+批量推送優化

Java多用于企業級后臺,重點解決“高并發、重試、批量處理”問題。

核心技巧
  1. 封裝通用HTTP客戶端:用OkHttp/HttpClient替代原生URLConnection,配置超時、重試(企微API偶發500,建議重試2次);
  2. AccessToken緩存:用Guava Cache/Redis緩存,設置1小時50分鐘過期(預留刷新時間);
  3. 批量處理chatid:外部群數量多時,用線程池異步推送(核心線程數≤10,避免觸發頻率限制);
  4. 異常捕獲:重點捕獲400(參數錯誤)、401(token失效)、429(限流),分別處理(401自動刷新token,429延遲重試)。
實戰代碼(Spring Boot環境)
import okhttp3.*;
import com.alibaba.fastjson.JSONObject;
import org.springframework.stereotype.Component;
import java.util.concurrent.TimeUnit;

@Component
public class WxWorkMsgSender {
    // 緩存access_token(生產環境替換為Redis/Guava Cache)
    private String accessToken;
    private long tokenExpireTime;

    // 初始化OkHttp客戶端(全局單例)
    private final OkHttpClient okHttpClient = new OkHttpClient.Builder()
            .connectTimeout(10, TimeUnit.SECONDS)
            .readTimeout(10, TimeUnit.SECONDS)
            .retryOnConnectionFailure(true)
            .build();

    // 獲取AccessToken(帶緩存)
    private String getValidAccessToken() {
        long now = System.currentTimeMillis();
        if (accessToken == null || now > tokenExpireTime) {
            // 調用企微gettoken接口,此處省略實現
            accessToken = fetchTokenFromWxWork();
            tokenExpireTime = now + 70 * 60 * 1000; // 70分鐘過期
        }
        return accessToken;
    }

    // 發送外部群文本消息
    public boolean sendExternalGroupMsg(String chatId, String content) {
        String url = "https://qyapi.weixin.qq.com/cgi-bin/appchat/send?access_token=" + getValidAccessToken();
        
        // 構建消息體
        JSONObject msgJson = new JSONObject();
        msgJson.put("chatid", chatId);
        msgJson.put("msgtype", "text");
        JSONObject textContent = new JSONObject();
        textContent.put("content", content);
        msgJson.put("text", textContent);
        msgJson.put("agentid", 1000002); // 替換為你的AgentID

        // 構建請求
        Request request = new Request.Builder()
                .url(url)
                .post(RequestBody.create(MediaType.parse("application/json; charset=utf-8"), msgJson.toJSONString()))
                .build();

        try (Response response = okHttpClient.newCall(request).execute()) {
            String respBody = response.body().string();
            JSONObject respJson = JSONObject.parseObject(respBody);
            if (respJson.getInteger("errcode") == 0) {
                return true;
            } else {
                // 處理異常:401刷新token重試,429延遲重試
                int errCode = respJson.getInteger("errcode");
                if (errCode == 401) {
                    accessToken = null; // 清空緩存,下次自動刷新
                    return sendExternalGroupMsg(chatId, content); // 重試1次
                } else if (errCode == 429) {
                    TimeUnit.SECONDS.sleep(2); // 延遲2秒重試
                    return sendExternalGroupMsg(chatId, content);
                }
                System.err.println("發送失敗:" + respJson.getString("errmsg"));
                return false;
            }
        } catch (Exception e) {
            e.printStackTrace();
            return false;
        }
    }

    // 實際調用企微gettoken接口的方法(需替換corpid和corpsecret)
    private String fetchTokenFromWxWork() {
        String corpid = "你的企業ID";
        String corpsecret = "你的應用秘鑰";
        String tokenUrl = String.format("https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=%s&corpsecret=%s", corpid, corpsecret);
        Request request = new Request.Builder().url(tokenUrl).get().build();
        try (Response response = okHttpClient.newCall(request).execute()) {
            String respBody = response.body().string();
            JSONObject respJson = JSONObject.parseObject(respBody);
            return respJson.getString("access_token");
        } catch (Exception e) {
            throw new RuntimeException("獲取AccessToken失敗", e);
        }
    }
}
Java專屬避坑
  • 避免用??System.out??打印日志,用SLF4J記錄異常(方便排查線上問題);
  • 消息體中??agentid??需為整型(別傳字符串,否則返回400錯誤);
  • 高并發場景下,AccessToken刷新需加鎖(避免多線程重復請求)。

(二)Go:輕量+高性能優化

Go適合做輕量網關/定時推送服務,重點利用協程+通道控制并發,減少資源占用。

核心技巧
  1. 協程池控制并發:用??sync.WaitGroup??+通道限制并發數(比如最多20個協程同時推送),避免觸發企微限流;
  2. AccessToken緩存:用??sync.Map??+定時器自動刷新(無需手動判斷過期);
  3. JSON序列化優化:用??encoding/json??的結構體替代map,減少序列化開銷;
  4. 超時控制:用??context.WithTimeout??給每個請求設置超時(避免阻塞協程)。
實戰代碼
package main

import (
	"context"
	"encoding/json"
	"fmt"
	"net/http"
	"sync"
	"time"
)

// 全局AccessToken緩存
var (
	tokenCache struct {
		sync.RWMutex
		token     string
		expiresAt time.Time
	}
	client = &http.Client{Timeout: 10 * time.Second}
)

// 企微API響應結構體
type WxWorkResp struct {
	Errcode int    `json:"errcode"`
	Errmsg  string `json:"errmsg"`
}

// 文本消息結構體
type TextMsg struct {
	Chatid  string `json:"chatid"`
	Msgtype string `json:"msgtype"`
	Agentid int    `json:"agentid"`
	Text    struct {
		Content string `json:"content"`
	} `json:"text"`
}

// 獲取有效的AccessToken
func getAccessToken() (string, error) {
	tokenCache.RLock()
	if time.Now().Before(tokenCache.expiresAt) {
		token := tokenCache.token
		tokenCache.RUnlock()
		return token, nil
	}
	tokenCache.RUnlock()

	// 加寫鎖刷新token
	tokenCache.Lock()
	defer tokenCache.Unlock()
	// 雙重檢查,避免多協程重復刷新
	if time.Now().Before(tokenCache.expiresAt) {
		return tokenCache.token, nil
	}

	// 調用企微gettoken接口
	corpid := "你的企業ID"
	corpsecret := "你的應用秘鑰"
	url := fmt.Sprintf("https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid=%s&corpsecret=%s", corpid, corpsecret)
	resp, err := client.Get(url)
	if err != nil {
		return "", fmt.Errorf("獲取token失敗:%v", err)
	}
	defer resp.Body.Close()

	var tokenResp struct {
		Errcode     int    `json:"errcode"`
		Errmsg      string `json:"errmsg"`
		AccessToken string `json:"access_token"`
		ExpiresIn   int    `json:"expires_in"`
	}
	if err := json.NewDecoder(resp.Body).Decode(&tokenResp); err != nil {
		return "", fmt.Errorf("解析token響應失敗:%v", err)
	}
	if tokenResp.Errcode != 0 {
		return "", fmt.Errorf("企微返回錯誤:%s", tokenResp.Errmsg)
	}

	// 更新緩存(過期時間減10分鐘,預留緩沖)
	tokenCache.token = tokenResp.AccessToken
	tokenCache.expiresAt = time.Now().Add(time.Duration(tokenResp.ExpiresIn-600) * time.Second)
	return tokenResp.AccessToken, nil
}

// 發送外部群消息(帶上下文超時)
func sendExternalGroupMsg(ctx context.Context, chatId, content string) bool {
	token, err := getAccessToken()
	if err != nil {
		fmt.Printf("獲取token失敗:%v\n", err)
		return false
	}

	url := fmt.Sprintf("https://qyapi.weixin.qq.com/cgi-bin/appchat/send?access_token=%s", token)
	msg := TextMsg{
		Chatid:  chatId,
		Msgtype: "text",
		Agentid: 1000002, // 替換為你的AgentID
	}
	msg.Text.Content = content

	// 序列化消息體
	msgBytes, err := json.Marshal(msg)
	if err != nil {
		fmt.Printf("序列化消息失敗:%v\n", err)
		return false
	}

	// 構建請求(帶上下文超時)
	req, err := http.NewRequestWithContext(ctx, "POST", url, bytes.NewBuffer(msgBytes))
	if err != nil {
		fmt.Printf("構建請求失敗:%v\n", err)
		return false
	}
	req.Header.Set("Content-Type", "application/json; charset=utf-8")

	resp, err := client.Do(req)
	if err != nil {
		fmt.Printf("發送請求失敗:%v\n", err)
		return false
	}
	defer resp.Body.Close()

	var wxResp WxWorkResp
	if err := json.NewDecoder(resp.Body).Decode(&wxResp); err != nil {
		fmt.Printf("解析響應失敗:%v\n", err)
		return false
	}

	if wxResp.Errcode == 0 {
		return true
	}
	// 處理429限流:延遲重試(最多1次)
	if wxResp.Errcode == 429 {
		time.Sleep(2 * time.Second)
		return sendExternalGroupMsg(ctx, chatId, content)
	}
	fmt.Printf("發送失敗:%s(code:%d)\n", wxResp.Errmsg, wxResp.Errcode)
	return false
}

// 批量發送(控制并發數)
func batchSend(chatIds []string, content string, maxConcurrency int) {
	ctx, cancel := context.WithTimeout(context.Background(), 30*time.Second)
	defer cancel()

	ch := make(chan string, maxConcurrency)
	var wg sync.WaitGroup

	// 啟動協程池
	for i := 0; i < maxConcurrency; i++ {
		go func() {
			for chatId := range ch {
				sendExternalGroupMsg(ctx, chatId, content)
				wg.Done()
			}
		}()
	}

	// 分發任務
	for _, chatId := range chatIds {
		wg.Add(1)
		ch <- chatId
	}
	close(ch)
	wg.Wait()
}

func main() {
	// 示例:批量發送給5個外部群,最大并發5
	chatIds := []string{"chat123456", "chat789012"}
	batchSend(chatIds, "【通知】企業服務升級提醒", 5)
}
Go專屬避坑
  • 協程池并發數別太高(建議≤20),否則容易觸發企微IP限流;
  • 上下文超時要合理(避免短任務超時,長任務阻塞);
  • 序列化時注意結構體字段首字母大寫(否則無法序列化)。

(三)Python:快速開發+腳本化優化

Python適合寫臨時推送腳本/輕量定時任務,重點簡化代碼、提升開發效率。

核心技巧
  1. 用requests庫簡化HTTP請求:配合??requests.Session??復用連接,減少握手開銷;
  2. AccessToken緩存:用??functools.lru_cache??或本地文件緩存(腳本場景);
  3. 異常處理簡化:用try-except捕獲常見錯誤(連接超時、JSON解析失敗);
  4. 批量推送用異步:用??aiohttp??替代requests,提升批量發送效率(腳本場景)。
實戰代碼(異步版)
import aiohttp
import asyncio
import json
import time
from functools import lru_cache

# 配置項
CORPID = "你的企業ID"
CORPSECRET = "你的應用秘鑰"
AGENTID = 1000002
MAX_RETRY = 1  # 最大重試次數
CONCURRENCY = 5  # 異步并發數

# 緩存AccessToken(lru_cache默認按參數緩存,此處無參數,緩存全局)
@lru_cache(maxsize=1)
def get_access_token():
    """獲取AccessToken(緩存70分鐘)"""
    url = f"https://qyapi.weixin.qq.com/cgi-bin/gettoken?corpid={CORPID}&corpsecret={CORPSECRET}"
    try:
        resp = aiohttp.ClientSession().get(url, timeout=10)
        resp_json = resp.json()
        if resp_json["errcode"] != 0:
            raise Exception(f"獲取token失敗:{resp_json['errmsg']}")
        # 記錄緩存時間,70分鐘后失效
        token = resp_json["access_token"]
        # 用lru_cache的過期機制(此處簡單處理,實際可加時間判斷)
        asyncio.get_event_loop().call_later(70*60, lambda: get_access_token.cache_clear())
        return token
    except Exception as e:
        print(f"獲取AccessToken異常:{e}")
        raise

async def send_external_group_msg(session, chat_id: str, content: str, retry=0):
    """異步發送外部群消息"""
    if retry > MAX_RETRY:
        print(f"[{chat_id}] 重試次數耗盡,發送失敗")
        return False
    
    try:
        token = get_access_token()
        url = f"https://qyapi.weixin.qq.com/cgi-bin/appchat/send?access_token={token}"
        msg = {
            "chatid": chat_id,
            "msgtype": "text",
            "agentid": AGENTID,
            "text": {"content": content}
        }
        async with session.post(url, json=msg, timeout=10) as resp:
            resp_json = await resp.json()
            if resp_json["errcode"] == 0:
                print(f"[{chat_id}] 發送成功")
                return True
            elif resp_json["errcode"] == 429:
                # 限流,延遲1秒重試
                print(f"[{chat_id}] 觸發限流,重試第{retry+1}次")
                await asyncio.sleep(1)
                return await send_external_group_msg(session, chat_id, content, retry+1)
            elif resp_json["errcode"] == 401:
                # token失效,清空緩存重試
                get_access_token.cache_clear()
                return await send_external_group_msg(session, chat_id, content, retry+1)
            else:
                print(f"[{chat_id}] 發送失敗:{resp_json['errmsg']}(code:{resp_json['errcode']})")
                return False
    except Exception as e:
        print(f"[{chat_id}] 發送異常:{e},重試第{retry+1}次")
        await asyncio.sleep(1)
        return await send_external_group_msg(session, chat_id, content, retry+1)

async def batch_send(chat_ids: list, content: str):
    """批量發送(控制并發數)"""
    # 創建異步session(復用連接)
    async with aiohttp.ClientSession() as session:
        # 限制并發數
        semaphore = asyncio.Semaphore(CONCURRENCY)
        tasks = []
        for chat_id in chat_ids:
            # 用信號量控制并發
            task = asyncio.create_task(
                send_with_semaphore(semaphore, session, chat_id, content)
            )
            tasks.append(task)
        # 等待所有任務完成
        await asyncio.gather(*tasks)

async def send_with_semaphore(sem, session, chat_id, content):
    """帶信號量的發送函數"""
    async with sem:
        await send_external_group_msg(session, chat_id, content)

if __name__ == "__main__":
    # 示例:發送給多個外部群
    chat_ids = ["chat123456", "chat789012"]
    content = "【溫馨提示】本周服務升級,如有問題請聯系客服"
    # 運行異步任務
    asyncio.run(batch_send(chat_ids, content))
Python專屬避坑
  • 異步場景下避免混用同步代碼(比如requests和aiohttp),否則會阻塞事件循環;
  • lru_cache緩存token時,注意清理機制(避免過期token一直緩存);
  • 腳本運行時注意編碼(中文內容需確保UTF-8,避免亂碼)。

三、通用避坑終極清單

  1. chatid獲取錯誤
  • 外部群chatid需通過??https://qyapi.weixin.qq.com/cgi-bin/externalcontact/groupchat/list??接口獲取,不能用群聊名稱/群號替代
  • 外部群解散/遷移后,chatid失效,需及時更新。
  1. 消息內容違規
  • 避免含敏感詞(廣告、違規營銷內容),否則消息會被攔截(無返回錯誤,但群內收不到);
  • 文本消息長度≤2048字,超出會返回400錯誤。
  1. 權限穿透問題
  • 應用需綁定到“客戶聯系”功能模塊,否則無法調用外部群接口;
  • 發送賬號需在企微客戶端登錄過,且未被禁用“外部聯系”權限。
  1. 跨企業推送限制
  • 僅能推送本企業創建的外部群,無法推送其他企業創建的外部群(即使是群成員)。
  1. 調試技巧

四、進階優化建議

  1. 消息模板化:將常用消息(通知、活動)封裝為模板,避免硬編碼內容;
  2. 推送記錄落地:記錄每個chatid的推送時間、內容、結果(數據庫/日志),便于排查問題;
  3. 限流降級:當觸發429錯誤時,自動降低推送頻率(比如從5條/分鐘降到3條/分鐘);
  4. 監控告警:對接Prometheus/Grafana,監控token失效、推送失敗率、限流次數,異常時告警。

無論用哪種語言,核心都是“先滿足企微API的規則,再結合語言特性優化性能和可維護性”。新手建議先從單條消息推送入手,驗證通過后再做批量、異步優化。

標簽
收藏
回復
舉報
回復
相關推薦
国产无套粉嫩白浆内谢的出处| 国产精品一级久久久| 国产三级精品三级观看| 欧美日韩黄网站| 性做久久久久久免费观看| 久久人人97超碰人人澡爱香蕉| 91视频在线视频| 亚洲九九视频| 亚洲女人被黑人巨大进入al| 午夜免费福利视频在线观看| 91九色porn在线资源| 国产日韩欧美制服另类| 亚洲自拍偷拍在线| 久久久蜜桃一区二区| 欧美~级网站不卡| 亚洲色图色老头| 俄罗斯黄色录像| 欧美videos粗暴| 狠狠躁夜夜躁人人爽天天天天97| 一区二区不卡视频| 日本大片在线观看| 成人综合婷婷国产精品久久| 国产精品美女久久久久久免费| 久草视频精品在线| 天天做天天爱天天综合网2021| 日韩精品视频中文在线观看| 香蕉视频xxxx| 日韩欧美看国产| 午夜精品一区二区三区电影天堂| 自拍另类欧美| 91精品国产综合久久久久久豆腐| 91亚洲大成网污www| 高清视频一区| 国内精品久久久久久久久久| 免费xxxx性欧美18vr| 欧美最猛黑人xxxx黑人猛叫黄 | 久久青草国产手机看片福利盒子| 2014国产精品| 国产农村妇女毛片精品| 美女性感视频久久| 国产精品久久久久久久9999| 成人午夜视频在线播放| 日韩一级欧洲| 国模精品系列视频| 精品亚洲永久免费| 激情久久久久| 久久久在线视频| 国产在线视频二区| 激情婷婷亚洲| 欧美激情啊啊啊| 久久精品女人毛片国产| 国产精品chinese| 欧美日本精品在线| 久久久久久天堂| 欧美色123| 欧美激情三级免费| 免费三片在线播放| 国产一区久久| 91精品国产91| 51国产偷自视频区视频| 久久亚洲精选| 国产精品视频导航| 国产农村老头老太视频| 国产大陆a不卡| 国产麻豆一区二区三区在线观看| 日本免费不卡视频| 久久久激情视频| 亚洲免费久久| 日韩激情av| 欧美日韩亚洲视频| 国产理论在线播放| 日韩视频一区二区三区四区| 亚洲黄色成人网| 国产肥白大熟妇bbbb视频| 日本久久黄色| 九九热在线精品视频| 国产一级性生活| 久久国产99| 成人av在线亚洲| 亚洲精品中文字幕成人片| av午夜精品一区二区三区| 欧美不卡1区2区3区| 午夜视频在线观看网站| 亚洲综合色噜噜狠狠| 久操网在线观看| 欧美日韩国产网站| 欧美变态tickle挠乳网站| 日本一区二区三区网站| 久久网站免费观看| 精品中文字幕在线| 中文人妻av久久人妻18| 国产剧情一区在线| 欧美中文娱乐网| 色呦呦在线观看视频| 色婷婷综合久久久中文字幕| 手机在线国产视频| 中文字幕精品影院| 欧美国产精品va在线观看| 青青国产在线观看| 国产一区二区伦理片| 久久综合色一本| 91福利国产在线观看菠萝蜜| 色综合久久中文综合久久97| 99中文字幕在线| 久久综合影院| 欧美极品少妇xxxxx| av首页在线观看| 成人在线一区二区三区| 亚洲一区二区三区免费观看| 国产在线美女| 日韩一区二区电影网| 亚洲区自拍偷拍| 伊人久久成人| 国产精品草莓在线免费观看| 免费看国产片在线观看| 成人免费在线视频| 精品国产成人av在线免| 国产精品玖玖玖在线资源| 日韩专区在线观看| 亚洲精品无码久久久久| 97精品国产97久久久久久久久久久久| 黄色网址在线免费看| 日韩网站中文字幕| 亚洲国产又黄又爽女人高潮的| 在线观看黄网址| 日本亚洲最大的色成网站www| 国产主播一区二区三区四区| 天堂av资源在线观看| 欧美精选午夜久久久乱码6080| 中文字幕国产专区| 国产精品腿扒开做爽爽爽挤奶网站| 亚洲在线一区二区| 日本三级在线视频| 欧美色欧美亚洲另类二区| 国产aⅴ激情无码久久久无码| 一本久道综合久久精品| 国产精品污www一区二区三区| 羞羞的视频在线看| 欧美一区二区三区性视频| www.4hu95.com四虎| 日韩国产欧美在线播放| 欧美日韩日本网| xx欧美视频| 亚洲欧美日韩天堂一区二区| wwwwww国产| 91老师片黄在线观看| 免费毛片网站在线观看| 乱亲女h秽乱长久久久| 91国内免费在线视频| 五月婷婷在线观看视频| 欧美日韩亚洲成人| 国产成人无码精品久久二区三| 国产欧美91| 日本不卡一二三区| 九七影院97影院理论片久久| 北条麻妃一区二区三区中文字幕 | 欧美一区二区三区在线观看| 免费国产羞羞网站美图| 国产乱人伦精品一区二区在线观看| 成年人免费观看的视频| 日本精品在线观看| 性色av一区二区三区免费| 香蕉久久国产av一区二区| 欧美性极品xxxx娇小| 性猛交娇小69hd| 精品一区二区三区在线观看| 2021国产视频| 欧美人妖在线观看| 国产成人综合亚洲| 麻豆视频在线观看免费| 日韩视频在线一区二区| 日韩和一区二区| 国产欧美一区在线| 成年人网站av| 国产亚洲永久域名| 午夜一区二区三视频在线观看| 欧美亚洲综合视频| 久久久噜噜噜久久| 国产裸舞福利在线视频合集| 欧美日韩高清一区二区不卡| 国产亚洲成人av| 国产亚洲综合性久久久影院| 日韩成人精品视频在线观看| 亚洲国产电影| 亚洲国产日韩美| 亚洲一区二区三区中文字幕在线观看| 午夜精品国产精品大乳美女| jizzjizz在线观看| 欧美精品一区二区在线播放| 91丝袜一区二区三区| 亚洲天堂精品视频| jizz欧美性20| 国产激情偷乱视频一区二区三区| 看av免费毛片手机播放| 亚洲中无吗在线| 久久久精品国产一区二区三区| 精品福利在线| 欧洲一区二区视频| 99热国产在线中文| 亚洲色图色老头| 蜜臀av免费在线观看| 欧美日韩小视频| 日韩中文字幕在线观看视频| 一区二区三区四区五区视频在线观看| 3d动漫精品啪啪一区二区下载 | 国产一区一区| 欧美中文在线视频| 中文在线手机av| 伊人久久久久久久久久久| 亚洲精品字幕在线观看| 欧美乱妇15p| 国产成人在线视频观看| 亚洲人成人一区二区在线观看 | 中文子幕无线码一区tr| 国产欧美视频一区| 美女视频一区在线观看| 欧美成人三级在线视频| 国产精品99久久精品| 欧美三日本三级少妇三99| 99香蕉久久| 国产剧情久久久久久| а√天堂中文在线资源8| 神马国产精品影院av| 日本福利片在线| 亚洲国产小视频在线观看| 亚洲a视频在线观看| 91精品国产美女浴室洗澡无遮挡| 国产在线观看第一页| 日韩欧美在线免费观看| 日韩久久精品视频| 亚洲一二三区视频在线观看| 97在线观看免费高| 中文字幕一区二区在线播放| 男人天堂资源网| 国产精品免费观看视频| 国产精品1区2区3区4区| 中文幕一区二区三区久久蜜桃| 国产传媒国产传媒| 欧美经典三级视频一区二区三区| 亚洲黄色小说视频| 国产视频一区二区三区在线观看| 午夜理伦三级做爰电影| 久久人人97超碰com| 国产小视频自拍| 国产欧美一区二区精品仙草咪 | 亚洲av成人无码久久精品老人| 精品区一区二区| 黄色成人一级片| 日韩国产精品视频| 四虎影院在线播放| 亚洲剧情一区二区| 成人全视频高清免费观看| 在线精品国产欧美| 男人天堂久久久| 九九精品在线播放| av中文在线资源| 欧美在线欧美在线| 成人深夜福利| 91香蕉国产在线观看| 日韩精品一级| 国产欧美日韩亚洲| 欧美激情在线免费| 亚洲一区综合| 欧美全黄视频| 无码人妻丰满熟妇区96| 免费亚洲电影在线| 国产探花在线观看视频| www.成人网.com| 三年中国中文观看免费播放| 亚洲欧美在线另类| 久青草视频在线观看| 精品国产福利在线| 一区二区三区播放| 亚洲精品一区二区三区在线观看| 日本中文字幕一区二区有码在线| 在线播放国产一区二区三区| 高清全集视频免费在线| 91av视频在线免费观看| 国产亚洲人成a在线v网站 | 激情五月综合| 日韩国产精品毛片| av成人天堂| 向日葵污视频在线观看| 从欧美一区二区三区| 性欧美一区二区| 一区二区国产盗摄色噜噜| av大片在线免费观看| 91精品国产综合久久小美女| 午夜国产在线视频| 麻豆成人在线看| 成人香蕉视频| 91一区二区三区| 国产一区二区三区四区二区| 日韩黄色片在线| 日日摸夜夜添夜夜添国产精品| 精品人妻一区二区乱码| 91在线一区二区三区| 在线看的片片片免费| 色综合久久久久久久| 精品国产亚洲av麻豆| 一区二区中文字幕| 日韩理论视频| 99精彩视频在线观看免费| 欧美熟妇交换久久久久久分类| 亚洲精品一线二线三线| 日本高清视频在线播放| 欧美亚洲激情在线| 欧美影院在线| 一级二级三级欧美| 久久久久国内| 国模私拍在线观看| 亚洲欧美日韩在线不卡| 欧美人一级淫片a免费播放| 亚洲国产欧美自拍| 天堂8中文在线| 成人精品网站在线观看| 国产精品手机在线播放| 777精品久无码人妻蜜桃| 国产91对白在线观看九色| 亚洲天堂网av在线| 欧美日韩成人在线一区| 黄色在线小视频| 欧洲精品在线视频| 欧美三级电影在线| 99在线免费视频观看| 国产精品18久久久久| 国产高潮流白浆| 欧美精品第1页| 欧美性videos| 国产精品三级在线| 欧洲grand老妇人| 久草在在线视频| 国产视频一区在线播放| 国产午夜麻豆影院在线观看| 精品视频久久久| 成人自拍av| 日韩一区二区电影在线观看| 老司机午夜免费精品视频| 亚洲熟妇一区二区三区| 欧美日韩一二三四五区| 日韩av资源站| 日韩av免费网站| 精品国产精品国产偷麻豆| 国产性生交xxxxx免费| 国产日韩精品一区二区三区| 波多野结衣大片| 综合激情国产一区| 外国成人毛片| 久久国产精品免费观看| 国产成人免费在线| 国产精品不卡av| 日韩精品欧美激情| 视频一区在线免费看| 亚洲欧美日产图| 精品一区二区三区视频在线观看| 精品国产视频一区二区三区| 欧美一级在线观看| 国产经典三级在线| 久久精品aaaaaa毛片| 日韩国产精品久久| 91传媒免费观看| 精品国精品国产尤物美女| 嗯啊主人调教在线播放视频| 蜜桃导航-精品导航| 麻豆91在线播放| 麻豆视频在线观看| 亚洲免费av片| 亚洲色图综合| 久久久亚洲精品无码| 久久精品亚洲一区二区三区浴池| 免费看av在线| 欧美猛少妇色xxxxx| 青草久久视频| 男女视频在线看| 亚洲影院理伦片| 免费看男男www网站入口在线 | 中国一级特黄视频| 久久99精品久久久久久琪琪| 欧美电影在线观看免费| 手机看片一级片| 亚洲综合一二三区| 国产有码在线| 粉嫩高清一区二区三区精品视频| 噜噜爱69成人精品| 天天操夜夜操av| 亚洲激情在线观看视频免费| 九色成人搞黄网站| 欧美午夜性视频| 国产精品国产三级国产普通话三级| 亚洲第一大网站| 国产精品一区二区久久精品| 最新亚洲一区| 最新av电影网站| 亚洲男人的天堂在线| 日韩精品视频中文字幕| av在线无限看| 午夜不卡在线视频| 国产黄色小视频在线| 奇米视频888战线精品播放| 粉嫩av一区二区三区粉嫩|