91超碰碰碰碰久久久久久综合_超碰av人澡人澡人澡人澡人掠_国产黄大片在线观看画质优化_txt小说免费全本

溫馨提示×

溫馨提示×

您好,登錄后才能下訂單哦!

密碼登錄×
登錄注冊×
其他方式登錄
點擊 登錄注冊 即表示同意《億速云用戶服務條款》

java+selenium如何實現網易云音樂刷累計聽歌數功能

發布時間:2021-08-10 14:53:23 來源:億速云 閱讀:150 作者:小新 欄目:編程語言

小編給大家分享一下java+selenium如何實現網易云音樂刷累計聽歌數功能,相信大部分人都還不怎么了解,因此分享這篇文章給大家參考一下,希望大家閱讀完這篇文章后大有收獲,下面讓我們一起去了解一下吧!

背景

應該是在去年的時候,刷知乎看到一個問題,大概是說怎么刷網易云音樂個人累計聽歌數,然后有一個高贊回答,貼了一段js代碼,直接在瀏覽器console執行就可以了。當時試了下,直接一下子刷了有好幾萬。悲劇的是,第二天又回到原來的樣子了,很明顯這種方式被網易云音樂發現封掉了。而且后續網易云還針對累計聽歌數加了一些限制,每天最多增加300首。今天帶來一種通過java+selenium的方式,自動播放歌曲,來達到刷累計聽歌數的效果。另外借助這個demo,對selenium的使用更加熟悉,也算是爬蟲應用中一些有趣的東西了。

思路

登錄,有以下兩種方式可以選擇:

a. 模擬web端的登錄過程。優點:這種方式更加通用,便于動態切換賬號。缺點:比直接使用cookie稍微麻煩一些,并且有一定幾率會出現圖形驗證碼,需要考慮這種情況。

b. 設置cookie。優點:不用處理登錄過程,比較簡單方便,在cookie的過期時間比較長情況下還是比較方便的,不用頻繁切換。缺點:切換賬號比較麻煩,不能達到自動化。我這里選擇的該方式。

播放:上一個步驟中登錄成功后,直接打開歌單列表頁面。如下圖

java+selenium如何實現網易云音樂刷累計聽歌數功能

,在歌單列表頁面可以看到。有3個地方是可以點擊播放的,我最先想到是最下面一個播放按鈕,然后一直保持底部播放組件的顯示,實時獲取播放的動態。嘗試通過模擬點擊播放按鈕,始終不成功,最終點擊最上面的播放按鈕可以播放的。

獲取播放動態:為了確定播放是否在正常進行,可以通過實時獲取個人home頁面的累計聽歌數相關信息,用于監控,由于已經有一個頁面在播放歌曲了,為了不影響原有播放歌曲的頁面,可以打開一個新的tab頁來獲取個人home頁面,打開新的table頁,這里采用js的方式window.open('about:blank')

最終都會看到如下類似如下格式日志,那就說明成功了:

2019-03-26 09:25:10,406 INFO [,main] - [com.github.wycm.Music163] - 伊犁河畔-00:00 / 00:00---當前播放第1首歌曲, 累計聽歌:20572
2019-03-26 09:25:16,817 INFO [,main] - [com.github.wycm.Music163] - 伊犁河畔-01:00 / 07:19---當前播放第1首歌曲, 累計聽歌:20572
2019-03-26 09:25:23,157 INFO [,main] - [com.github.wycm.Music163] - 伊犁河畔-01:06 / 07:19---當前播放第1首歌曲, 累計聽歌:20572
2019-03-26 09:25:29,394 INFO [,main] - [com.github.wycm.Music163] - 伊犁河畔-01:13 / 07:19---當前播放第1首歌曲, 累計聽歌:20572
2019-03-26 09:25:35,592 INFO [,main] - [com.github.wycm.Music163] - 伊犁河畔-01:19 / 07:19---當前播放第1首歌曲, 累計聽歌:20572
2019-03-26 09:25:41,974 INFO [,main] - [com.github.wycm.Music163] - 伊犁河畔-01:25 / 07:19---當前播放第1首歌曲, 累計聽歌:20572

完整代碼

package com.github.wycm;

import org.openqa.selenium.*;
import org.openqa.selenium.chrome.ChromeDriver;
import org.openqa.selenium.chrome.ChromeOptions;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

import java.util.*;
import java.util.concurrent.TimeUnit;
import java.util.regex.Matcher;
import java.util.regex.Pattern;

/**
 * Created by wycm
 */
public class Music163 {
 private static Logger logger = LoggerFactory.getLogger(Music163.class);

 //拷貝登錄成功的瀏覽器原始cookie
 private final static String RAW_COOKIES = "cookie1=value1; cookie2=value2";
 private final static String CHROME_DRIVER_PATH = "/Users/wangyang/Downloads/chromedriver";
 //歌曲列表id
 private static String startId = "22336453";
 
 
 private static String userId = null;
 private static Set<String> playListSet = new HashSet<>();
 private static Pattern pattern = Pattern.compile("<span class=\"j-flag time\"><em>(.*?)</em>(.*?)</span>");
 private static Pattern songName = Pattern.compile("class=\"f-thide name fc1 f-fl\" title=\"(.*?)\"");
 private static ChromeOptions chromeOptions = new ChromeOptions();
 private static WebDriver driver = null;
 static {
  System.setProperty("webdriver.chrome.driver", CHROME_DRIVER_PATH);
  chromeOptions.addArguments("--no-sandbox");
 }
 public static void main(String[] args) throws InterruptedException {
  while (true){
   try {
    driver = new ChromeDriver(chromeOptions);
    playListSet.add(startId);
    invoke();
   } catch (Exception e){
    logger.error(e.getMessage(), e);
   } finally {
    driver.quit();
   }
   Thread.sleep(1000 * 10);
  }
 }

 /**
  * 初始化cookies
  */
 private static void initCookies(){
  Arrays.stream(RAW_COOKIES.split("; ")).forEach(rawCookie -> {
   String[] ss = rawCookie.split("=");
   Cookie cookie = new Cookie.Builder(ss[0], ss[1]).domain(".163.com").build();
   driver.manage().addCookie(cookie);
  });
 }
 private static void invoke() throws InterruptedException {
  driver.manage().timeouts().implicitlyWait(5, TimeUnit.SECONDS);
  driver.manage().timeouts().pageLoadTimeout(15, TimeUnit.SECONDS);
  String s = null;
  driver.get("http://music.163.com/");
  initCookies();
  driver.get("http://music.163.com/");
  s = driver.getPageSource();
  userId = group(s, "userId:(\\d+)", 1);
  driver.get("https://music.163.com/#/playlist?id=" + startId);
  driver.switchTo().frame("contentFrame");
  WebElement element = driver.findElement(By.cssSelector("[id=content-operation]>a:first-child"));
  element.click();
  ((JavascriptExecutor) driver).executeScript("window.open('about:blank')");
  ArrayList<String> tabs = new ArrayList<String>(driver.getWindowHandles());
  driver.switchTo().window(tabs.get(0));
  driver.switchTo().defaultContent();
  int i = 0;
  String lastSongName = "";
  int count = 0;
  while (true){
   if(i > Integer.MAX_VALUE - 2){
    break;
   }
   i++;
   s = driver.getPageSource();
   driver.switchTo().window(tabs.get(1)); //switches to new tab
   String songs = null;
   try{
    driver.get("https://music.163.com/user/home?id=" + userId);
    driver.switchTo().frame("contentFrame");
    songs = group(driver.getPageSource(), "累積聽歌(\\d+)首", 1);
   } catch (TimeoutException e){
    logger.error(e.getMessage(), e);
   }
   driver.switchTo().window(tabs.get(0));
   Matcher matcher = pattern.matcher(s);
   Matcher songNameMatcher = songName.matcher(s);
   if (matcher.find() && songNameMatcher.find()){
    String songNameStr = songNameMatcher.group(1);
    if (!songNameStr.equals(lastSongName)){
     count++;
     lastSongName = songNameStr;
    }
    logger.info(songNameStr + "-" + matcher.group(1) + matcher.group(2) + "---當前播放第" + count + "首歌曲, 累計聽歌:" + songs);
   } else {
    logger.info("解析歌曲播放記錄或歌曲名失敗");
   }
   Thread.sleep(1000 * 30);
  }
 }
 public static String group(String str, String regex, int index) {
  Pattern pattern = Pattern.compile(regex);
  Matcher matcher = pattern.matcher(str);
  return matcher.find() ? matcher.group(index) : "";
 }
}

運行注意事項

  • 修改自己相關chromedriver路徑配置

  • 登錄自己的web端網易云音樂:https://music.163.com/

  • 復制自己登錄成功的原始cookies,至代碼中的RAW_COOKIES字段

  • 切換歌單,如果默認的歌單播放完成后,可以搜索一些沒有播放過的歌單,類似https://music.163.com/#/playlist?id=22336453的url,提取出id,直接替換代碼中的startId字段。

以上是“java+selenium如何實現網易云音樂刷累計聽歌數功能”這篇文章的所有內容,感謝各位的閱讀!相信大家都有了一定的了解,希望分享的內容對大家有所幫助,如果還想學習更多知識,歡迎關注億速云行業資訊頻道!

向AI問一下細節

免責聲明:本站發布的內容(圖片、視頻和文字)以原創、轉載和分享為主,文章觀點不代表本網站立場,如果涉及侵權請聯系站長郵箱:is@yisu.com進行舉報,并提供相關證據,一經查實,將立刻刪除涉嫌侵權內容。

AI

广汉市| 河源市| 浦北县| 建平县| 苍山县| 彩票| 金塔县| 镇雄县| 海口市| 樟树市| 北京市| 株洲市| 洛川县| 珲春市| 辽阳市| 偃师市| 阆中市| 洛浦县| 阿瓦提县| 通州市| 阿巴嘎旗| 衡阳县| 大新县| 东兴市| 年辖:市辖区| 长子县| 长治市| 伊通| 务川| 卫辉市| 商水县| 资溪县| 五寨县| 清涧县| 阿坝县| 盐城市| 楚雄市| 安化县| 岳普湖县| 景德镇市| 沽源县|