精品欧美一区二区三区在线观看 _久久久久国色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的規則,再結合語言特性優化性能和可維護性”。新手建議先從單條消息推送入手,驗證通過后再做批量、異步優化。

標簽
收藏
回復
舉報
回復
相關推薦
高清免费日韩| 欧美猛少妇色xxxxx| 大肉大捧一进一出好爽动态图| 婷婷色在线观看| 国产欧美一区二区三区国产幕精品| 亚洲精品国产美女| 性欧美极品xxxx欧美一区二区| a√在线中文网新版址在线| 精品一区二区三区在线播放| 久久97久久97精品免视看| 国产伦精品一区二区三区精品| 欧美特黄aaaaaaaa大片| 亚洲私人黄色宅男| 精品伦精品一区二区三区视频| 国产精品第六页| 中文视频一区| 亚洲欧美中文日韩v在线观看| 亚洲一级免费在线观看| 黄网av在线| 国产三级久久久| 999视频在线免费观看| 成年人av网站| 欧美黄色大片网站| 亚洲全黄一级网站| 男人的天堂免费| 国产成人免费9x9x人网站视频 | 狠狠做六月爱婷婷综合aⅴ| 欧美日本韩国一区二区三区视频 | jizz日本免费| 超碰国产精品一区二页| 日韩欧美aⅴ综合网站发布| ijzzijzzij亚洲大全| 精品视频一二三| 国产999精品久久久久久绿帽| 国产精品成久久久久三级| 国产主播在线播放| 一区二区三区国产精华| 亚洲人成五月天| 熟妇高潮一区二区| 欧美久久亚洲| 欧美日韩你懂的| 韩国一区二区av| 国产美女一区视频| 亚洲免费在线电影| 亚洲一区二区精品在线观看| 日韩av成人| 国产伦理精品不卡| 91精品国产综合久久久久久久久| 欧美日韩综合在线观看| 亚洲午夜激情在线| 欧美成人免费小视频| www亚洲色图| 国产精品亚洲二区| 亚洲免费一在线| 国产精品久久久久久久无码| 亚洲**毛片| 91精品国产综合久久久蜜臀粉嫩 | 欧美日韩性生活| 国产l精品国产亚洲区久久| √最新版天堂资源网在线| 一区二区三区免费看视频| 一区二区成人国产精品| av在线免费观看网站| 日本一区二区免费在线观看视频 | av福利精品导航| 懂色av一区二区三区在线播放| 国产欧美综合视频| 国产精品123| 91久色国产| 午夜精品小视频| 国产精品99久久久久久久女警| 91在线国产电影| 国产后入清纯学生妹| 国产激情91久久精品导航 | 99久久精品费精品国产一区二区| 国产精品日本一区二区| 神宫寺奈绪一区二区三区| 不卡一区二区三区四区| 蜜桃av噜噜一区二区三区| 日本国产在线| 日本一区二区三区在线不卡| 在线观看日本一区| av在线官网| 亚洲一级二级三级| 18禁免费观看网站| 欧美日韩大片| 欧美精品日日鲁夜夜添| 日本55丰满熟妇厨房伦| 都市激情亚洲| 亚洲人成电影在线观看天堂色| 黄色免费一级视频| 中文精品久久| 欧美亚洲国产另类| 亚洲视频一区在线播放| 国产激情一区二区三区四区 | 国产综合免费视频| 国产国产一区| 日韩三级视频在线看| 日韩精品视频一区二区| 欧美一区电影| 欧美精品在线观看91| 欧美三级午夜理伦| 美女网站色91| 国产精品自拍首页| h视频在线观看免费| 亚洲免费av观看| 精品人妻一区二区三区四区在线| 国产成人福利夜色影视| 日韩欧美高清在线| 黄色片网站免费| 亚洲视频久久| 国产精品夜间视频香蕉| 亚洲爱情岛论坛永久| 国产日韩欧美精品电影三级在线| 久久久无码中文字幕久...| 久久人体大尺度| 欧美一区三区四区| 实拍女处破www免费看| 午夜精品999| 国产成人一区二| 成人毛片在线精品国产| 国产精品福利一区| 亚洲国产精品久久久久婷蜜芽| 亚洲网站免费| 国产亚洲一级高清| 日韩福利片在线观看| 狠狠久久亚洲欧美| 日本在线成人一区二区| 欧洲一区精品| 日韩精品一区二区三区在线观看| 女人裸体性做爰全过| 欧美亚洲一区| 精品一区久久久| 亚洲第一图区| 欧美高清hd18日本| 亚洲自拍偷拍图| 99伊人成综合| yy111111少妇影院日韩夜片| 97电影在线| 色欧美片视频在线观看| 制服丝袜第一页在线观看| 欧美精品一线| 亚洲a一级视频| 久久精品视频观看| 欧美日韩一区二区三区在线看| 欧美bbbbb性bbbbb视频| 在线观看亚洲| 国产精品毛片一区视频| 日本在线观看高清完整版| 91精品婷婷国产综合久久 | 伊人一区二区三区| 在线观看av免费观看| 日韩中文字幕高清在线观看| 国产成人亚洲综合91| 九色视频在线观看免费播放| 欧美日韩国产精品一区二区三区四区| 国偷自产av一区二区三区麻豆| 91精品一区二区三区综合| 国产日韩在线看片| 日本网站在线免费观看视频| 欧美亚洲国产bt| 林心如三级全黄裸体| 美日韩一级片在线观看| 在线观看一区二区三区三州| 欧美日韩卡一| xxxxx91麻豆| 国产女18毛片多18精品| 亚洲日本韩国一区| 黄页网站在线看| 激情视频一区| 久久五月天婷婷| 黄色成人免费网| 国产一区二区精品丝袜| 又污又黄的网站| 中文字幕视频一区二区三区久| 国产在线观看中文字幕| 亚洲香蕉网站| 久久人人九九| 巨胸喷奶水www久久久免费动漫| 一级做a爰片久久毛片美女图片| 欧美成人一区二区视频| 亚洲品质自拍视频| 国产一卡二卡三卡四卡| 午夜一级久久| 亚洲欧美久久久久一区二区三区| 亚洲色图图片| 久久理论片午夜琪琪电影网| 亚洲av成人精品日韩在线播放| 色婷婷av一区二区三区之一色屋| 人人妻人人澡人人爽| 国内精品视频666| 日韩黄色片在线| 免费久久久久久久久| 国产日韩欧美另类| 国产理论电影在线| 国产一区二区美女视频| 精品久久久久中文慕人妻| 黑人巨大精品欧美一区二区一视频| 欧美激情 亚洲| 久久亚洲综合| 在线观看成人免费| 日韩美女精品| 成人激情电影一区二区| sm在线播放| 日韩中文理论片| 三级视频在线看| 欧美色倩网站大全免费| 久久精品视频国产| 国产精品久久久久一区二区三区共| 欧美色图校园春色| 日本强好片久久久久久aaa| 狠狠噜天天噜日日噜| 国产一区二区观看| 国产精品久久久久久久小唯西川| 成人网ww555视频免费看| 国产综合在线视频| 毛片在线播放a| 日韩精品免费电影| 精品人妻一区二区三区四区不卡| 欧美性xxxx极品hd满灌| 久久久久亚洲av片无码下载蜜桃| 国产午夜精品美女毛片视频| 大尺度在线观看| 久久成人18免费观看| 99999精品视频| 欧美精品色网| 永久免费在线看片视频| 国产欧美日韩在线一区二区| 国产精品日韩欧美一区二区三区| 综合欧美精品| 国产精品香蕉国产| 新片速递亚洲合集欧美合集| 久久久久中文字幕2018| 免费黄网站在线| 国产性色av一区二区| 日韩一卡二卡在线| 日韩一区二区精品葵司在线| 国产裸体美女永久免费无遮挡| 懂色av中文一区二区三区天美| 久久久久97国产| 亚洲视频资源在线| 特级西西人体高清大胆| 中文字幕第一区| 欧美特黄一区二区三区| 99久久精品国产精品久久| 欧美做受高潮中文字幕| 国产成人精品免费视频网站| 国产高清999| 精品一区二区三区不卡| 日韩精品视频一二三| 日本欧美韩国一区三区| 五月婷婷狠狠操| 免费看欧美美女黄的网站| 一道本视频在线观看| 日产国产欧美视频一区精品| 能看的毛片网站| 丝袜国产日韩另类美女| 亚洲中文字幕无码不卡电影| 亚洲免费婷婷| aa免费在线观看| 青青青爽久久午夜综合久久午夜| 午夜dv内射一区二区| 日本欧美一区二区三区| 污污动漫在线观看| 激情小说亚洲一区| 超碰91在线播放| 高清在线成人网| 91九色蝌蚪porny| www国产精品av| 成人免费毛片糖心| 亚洲国产成人一区二区三区| 日本一道本视频| 中文字幕视频一区| 久草视频在线资源| 亚洲aaa精品| 欧美性猛交bbbbb精品| 在线免费一区三区| 亚洲中文字幕在线观看| 欧美一二三在线| 日本精品久久久久久| 亚洲精品综合精品自拍| www.视频在线.com| 久久躁狠狠躁夜夜爽| 成人影音在线| 日本精品视频在线| 视频欧美精品| 国产精品有限公司| 成人aaaa| 国产成人一区二区三区别| 亚洲一区二区三区高清不卡| 午夜宅男在线视频| 国产91精品在线观看| av黄色免费网站| 亚洲美女少妇撒尿| 在线观看 亚洲| 欧美夫妻性生活| 五月婷婷综合久久| 日韩在线激情视频| 高h视频在线播放| 国产精品美女在线| 激情亚洲另类图片区小说区| 日韩在线导航| 激情综合在线| 在线观看免费av网址| av在线不卡电影| 国产jizz18女人高潮| 亚洲777理论| 一级黄色小视频| 日韩成人在线视频观看| 免费av网站在线看| 日本成人免费在线| 亚洲图色一区二区三区| 日韩三级在线播放| 亚洲激情网站| 97人人爽人人| 久久综合九色综合欧美亚洲| a在线视频播放观看免费观看| 欧美性猛交xxxx黑人| 亚洲国产精品国自产拍久久| 91麻豆蜜桃一区二区三区| www.久久国产| 亚洲免费色视频| 91麻豆精品在线| 亚洲国产精品久久91精品| 91精品国产91久久久久游泳池| 国外成人在线直播| 久久久久久爱| 亚洲午夜精品一区二区| 亚洲日本成人| 久久久国产精品久久久| 综合精品久久久| 成人一级免费视频| 亚洲精品在线91| av岛国在线| 91视频免费在线观看| 国产精品久久久久久影院8一贰佰 国产精品久久久久久麻豆一区软件 | 国产精品91在线观看| 美女一区2区| 野外做受又硬又粗又大视频√| 国产在线麻豆精品观看| 少妇一级黄色片| 91国偷自产一区二区使用方法| 亚洲av片在线观看| 97久久精品视频| 91精品国产自产精品男人的天堂| 亚洲天堂av免费在线观看| 丝袜美腿成人在线| 国产精品国产三级国产专业不 | 欧美日韩a v| 亚洲美女在线视频| 亚洲最新无码中文字幕久久| 精品日产一区2区三区黄免费| 在线播放日韩| 亚洲の无码国产の无码步美| 亚洲图片欧美视频| 天堂网av在线播放| 97超碰国产精品女人人人爽| 精品成人自拍视频| 欧美 日韩 国产 高清| 97久久精品人人做人人爽50路 | 女生裸体视频一区二区三区| 亚洲免费黄色网| 亚洲视频资源在线| www国产在线| 久久久久女教师免费一区| theporn国产在线精品| 成年人午夜免费视频| 99精品欧美一区二区蜜桃免费| 国产成人精品一区二三区| 亚洲视频在线观看免费| 99re久久| 国产欧美综合一区| 成人精品视频网站| 久久久免费高清视频| 在线不卡国产精品| 99精品女人在线观看免费视频| 欧美三级午夜理伦三级老人| 国产v综合v亚洲欧| 中文字幕激情小说| 中国china体内裑精亚洲片| 国产精品一区二区美女视频免费看| 欧美久久久久久久久久久久久久| 成人美女在线观看| 免费观看日批视频| 久久久精品电影| 国产精品tv| 熟妇人妻va精品中文字幕| 自拍视频在线观看一区二区| 亚洲欧美强伦一区二区| 国产精品mp4| 亚洲成人三区| 国产精品无码一区二区三区免费| 欧美性色黄大片| 新版中文在线官网| 麻豆一区区三区四区产品精品蜜桃| 美女在线视频一区| 精品在线播放视频| 色伦专区97中文字幕| 久久97久久97精品免视看秋霞| 色哟哟精品视频|