예제 #1
0
파일: trending.py 프로젝트: z-kf/tiktokpy
    def avatar(self) -> str:
        img = self.selector.css(".avatar > img")
        if not img:
            logger.warning("Avatar src not found")
            return ""

        return img.attrib["src"]
예제 #2
0
    async def unlike(self, username: str, video_id: str):
        page: Page = await self.client.new_page(
            blocked_resources=["image", "media", "font"])
        logger.debug(f"ЁЯСе Unlike video id {video_id} of @{username}")

        like_info_queue: asyncio.Queue = asyncio.Queue(maxsize=1)
        video_info_queue: asyncio.Queue = asyncio.Queue(maxsize=1)

        page.on(
            "response",
            lambda res: asyncio.create_task(
                catch_response_info(res, video_info_queue, "/item/detail"), ),
        )

        page.on(
            "response",
            lambda res: asyncio.create_task(
                catch_response_info(res, like_info_queue, "/commit/item/digg"),
            ),
        )

        logger.info(
            f"ЁЯзн Going to @{username}'s video {video_id} page for unlike")

        await self.client.goto(
            f"/@{username}/video/{video_id}",
            page=page,
            options={"waitUntil": "networkidle0"},
        )

        video_info = await video_info_queue.get()

        if not video_info["itemInfo"]["itemStruct"]["digged"]:
            logger.info(f"ЁЯШП @{username}'s video {video_id} already unliked")
            return

        like_part = await page.J(".like-part")

        if like_part:
            await page.click(".like-part")
        else:
            await page.click(
                ".video-feed-container .lazyload-wrapper:first-child .bar-item-wrapper:first-child",
            )

        like_info = await like_info_queue.get()

        if like_info["status_code"] == 0:
            logger.info(f"ЁЯСО @{username}'s video {video_id} unliked")
        else:
            logger.warning(
                f"тЪая╕П  @{username}'s video {video_id} probably not unliked")

        await page.close()
예제 #3
0
    async def unfollow(self, username: str):
        page: Page = await self.client.new_page(
            blocked_resources=["image", "media", "font"])
        logger.debug(f"👥 Unfollow {username}")

        unfollow_info_queue: asyncio.Queue = asyncio.Queue(maxsize=1)

        page.on(
            "response",
            lambda res: asyncio.create_task(
                catch_response_info(res, unfollow_info_queue,
                                    "/commit/follow/user"), ),
        )

        logger.info(f"🧭 Going to {username}'s page for unfollowing")

        await self.client.goto(
            f"/@{username.lstrip('@')}",
            page=page,
            options={"waitUntil": "networkidle0"},
        )

        try:
            follow_title: str = await page.Jeval(
                ".follow-button",
                pageFunction="element => element.textContent",
            )
        except ElementHandleError:
            print("ElementHandleError")
            return

        if follow_title.lower() != "following" and follow_title.lower(
        ) != "friends":
            logger.info(f"😏 {username} already unfollowed")
            return

        await page.click(".follow-button")

        unfollow_info = await unfollow_info_queue.get()

        if unfollow_info["status_code"] == 0:
            logger.info(f"➖ {username} unfollowed")
        else:
            logger.warning(f"⚠️  {username} probably not unfollowed")

        await page.close()
예제 #4
0
    async def follow(self, username: str):
        page: Page = await self.client.new_page(
            blocked_resources=["image", "media", "font"])
        logger.debug(f"ЁЯСе Follow {username}")

        follow_info_queue: asyncio.Queue = asyncio.Queue(maxsize=1)

        page.on(
            "response",
            lambda res: asyncio.create_task(
                catch_response_info(res, follow_info_queue,
                                    "/commit/follow/user"), ),
        )

        logger.info(f"ЁЯзн Going to {username}'s page for following")

        await self.client.goto(
            f"/@{username.lstrip('@')}",
            page=page,
            options={"waitUntil": "networkidle0"},
        )

        follow_title: str = await page.Jeval(
            ".follow-button",
            pageFunction="element => element.textContent",
        )

        if follow_title.lower() != "follow":
            logger.info(f"ЁЯШП {username} already followed")
            return

        await page.click(".follow-button")

        follow_info = await follow_info_queue.get()

        if follow_info["status_code"] == 0:
            logger.info(f"тЮХ {username} followed")
        else:
            logger.warning(f"тЪая╕П  {username} probably not followed")

        await page.close()
예제 #5
0
    async def unlike(self, username: str, video_id: str):
        page: Page = await self.client.new_page(
            blocked_resources=["image", "media", "font"])
        logger.debug(f"👥 Unlike video id {video_id} of @{username}")

        like_info_queue: asyncio.Queue = asyncio.Queue(maxsize=1)

        page.on(
            "response",
            lambda res: asyncio.create_task(
                catch_response_info(res, like_info_queue, "/commit/item/digg"),
            ),
        )

        logger.info(
            f"🧭 Going to @{username}'s video {video_id} page for unlike")

        await self.client.goto(
            f"/@{username}/video/{video_id}",
            page=page,
            options={"waitUntil": "networkidle0"},
        )

        like_selector = ".lazyload-wrapper:first-child .item-action-bar.vertical > .bar-item-wrapper:first-child"  # noqa: E501
        is_unliked = await page.J(f'{like_selector} svg[fill="currentColor"]')

        if is_unliked:
            logger.info(f"😏 @{username}'s video {video_id} already unliked")
            return

        await page.click(like_selector)

        like_info = await like_info_queue.get()

        if like_info["status_code"] == 0:
            logger.info(f"👎 @{username}'s video {video_id} unliked")
        else:
            logger.warning(
                f"⚠️  @{username}'s video {video_id} probably not unliked")

        await page.close()
예제 #6
0
    async def unlike(self, username: str, video_id: str):
        page: Page = await self.client.new_page(
            blocked_resources=["image", "media", "font"])
        logger.debug(f"ЁЯСе Unlike video id {video_id} of @{username}")

        like_info_queue: asyncio.Queue = asyncio.Queue(maxsize=1)

        page.on(
            "response",
            lambda res: asyncio.create_task(
                catch_response_info(res, like_info_queue, "/commit/item/digg"),
            ),
        )

        logger.info(
            f"ЁЯзн Going to @{username}'s video {video_id} page for unlike")

        await self.client.goto(
            f"/@{username}/video/{video_id}",
            page=page,
            options={"waitUntil": "networkidle0"},
        )

        like_element = await page.J("span.like")

        if "liked" not in like_element._remoteObject["description"]:
            logger.info(f"ЁЯШП @{username}'s video {video_id} already unliked")
            return

        await page.click(".like-part")

        like_info = await like_info_queue.get()

        if like_info["status_code"] == 0:
            logger.info(f"ЁЯСН @{username}'s video {video_id} unliked")
        else:
            logger.warning(
                f"тЪая╕П  @{username}'s video {video_id} probably not unliked")

        await page.close()