[java+selenium] Netease облачная музыкальная щетка совокупное количество прослушанных песен

рептилия

задний план

В прошлом году было бы прошло в прошлом году, что я увидел вопрос о Жиху, который был о том, как проводить промежуточную облачную музыку в кумулятивном количестве песен, которые я слушал, а затем был высокий похвальный ответ. Я опубликовал кусок кода JS, которые могут быть выполнены непосредственно в консоли браузера., Я попробовал его в то время, и я сразу почистил десятки тысяч. Трагически, он вернулся в свое первоначальное состояние на следующий день. Очевидно, этот метод был найден и заблокирован и заблокирован музыкальной облачной музыкой. Кроме того, облако Neteste также добавила некоторые ограничения на совокупное количество песен, слушаемых, не более 300 песен в день. Сегодня я приношу метод автоматически воспроизведения песен через Java + Selenium для достижения эффекта чистки совокупного количества песен. Кроме того, с этой демонстрируем, я более знаком с использованием селена, который можно рассматривать как некоторые интересные вещи в приложениях гусениц.

идеи

  • Войти можно двумя способами: А. Смоделируйте процесс входа в систему на веб-сайте. Преимущества: этот метод является более общим и простым для динамического переключения учетных записей. Недостатки: Это немного более хлопотно, чем использование файлов cookie напрямую, и есть определенная вероятность появления графического кода подтверждения, что необходимо учитывать. Б. Установка файлов cookie. Преимущества: не нужно иметь дело с процессом входа в систему, он относительно прост и удобен, и более удобен, когда время истечения файла cookie относительно велико, и нет необходимости часто переключаться. Недостатки: переключение учетных записей хлопотно и не может быть автоматизировано. Путь, который я выбираю здесь.

  • Воспроизведение: после успешного входа в систему на предыдущем шаге непосредственно откройте страницу списка воспроизведения. Как показано ниже

    , вы можете увидеть его на странице со списком плейлистов. Есть 3 места, которые можно щелкнуть для воспроизведения, я сначала подумал о кнопке воспроизведения внизу, а затем сохранил отображение нижнего компонента воспроизведения и получил динамику воспроизведения в реальном времени. Попытки нажать кнопку воспроизведения путем имитации всегда безуспешны, и, наконец, нажмите кнопку воспроизведения вверху, чтобы начать воспроизведение.

  • Получить динамику воспроизведения: чтобы определить, нормально ли идет воспроизведение, вы можете получить информацию о совокупном количестве прослушанных песен на личной домашней странице в режиме реального времени для мониторинга.Поскольку уже есть страница, воспроизводящая песни, чтобы не чтобы повлиять на исходную страницу воспроизведения песен, вы можете открыть новую вкладку, чтобы получить личную домашнюю страницу, открыть новую страницу таблицы, здесь используется метод jswindow.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
  • Войдите в NetEase Cloud Music на своем веб-терминале:music.163.com/
  • Скопируйте исходные файлы cookie вашего успешного входа в поле RAW_COOKIES в коде.
  • Переключите список воспроизведения.Если воспроизводится список воспроизведения по умолчанию, вы можете искать некоторые невоспроизведенные списки воспроизведения, подобныеhttps://music.163.com/#/playlist?id=22336453url, извлеките идентификатор и напрямую замените поле startId в коде.

Суммировать

  • У вас могут возникнуть вопросы, я хочу поставить эту задачу на свой собственный сервер, чтобы она работала прямо в фоновом режиме. Это проблема создания рабочей среды Selenium на сервере, вы можете обратиться к моей предыдущей статье. Alibaba Cloud и Tencent Cloud могут работать с минимальной конфигурацией сервера.
  • Кроме того, почему здесь используется метод selenium, и есть ли другой более простой способ добиться эффекта брашинга напрямую через простой Http-запрос. Я лично пытался найти запрос на увеличение совокупного количества прослушанных песен по чистому http-запросу, но не смог найти, потому что запросы от Netbank Cloud были зашифрованы. Так что используйте вместо этого селен.

Наконец

Уведомление об авторских правах Добавить Автора
Источник:nuggets.capable/post/684490…Ваша поддержка — величайшее поощрение для блоггеров, спасибо за внимательное чтение.
Авторские права на эту статью принадлежат автору, и вы можете ее перепечатать, но это заявление должно быть сохранено без согласия автора, а ссылка на исходный текст дана в видном месте на странице статьи, в противном случае право преследовать юридическую ответственность зарезервировано.

一个程序员日常分享,包括但不限于爬虫、Java后端技术,欢迎关注