예제 #1
0
    def getImagePage(self, imageId, parent=None, fromBookmark=False,
                     bookmark_count=-1, image_response_count=-1):
        image = None
        response = None
        PixivHelper.GetLogger().debug("Getting image page: {0}".format(imageId))
        if self._isWhitecube:
            url = "https://www.pixiv.net/rpc/whitecube/index.php?mode=work_details_modal_whitecube&id={0}&tt={1}".format(imageId, self._whitecubeToken)
            response = self.open(url).read()
            PixivHelper.GetLogger().debug(response);
            image = PixivModelWhiteCube.PixivImage(imageId,
                                                   response,
                                                   parent,
                                                   fromBookmark,
                                                   bookmark_count,
                                                   image_response_count,
                                                   dateFormat=self._config.dateFormat)
            # overwrite artist info
            self.getMemberInfoWhitecube(image.artist.artistId, image.artist)
        else:
            url = "http://www.pixiv.net/member_illust.php?mode=medium&illust_id={0}".format(imageId)
            response = self.open(url).read()
            parsed = BeautifulSoup(response)
            image = PixivModel.PixivImage(imageId,
                                          parsed,
                                          parent,
                                          fromBookmark,
                                          bookmark_count,
                                          image_response_count,
                                          dateFormat=self._config.dateFormat)
            if image.imageMode == "ugoira_view" or image.imageMode == "bigNew":
                image.ParseImages(parsed)
            parsed.decompose()

        return (image, response)
예제 #2
0
def createAvatarFilename(artistPage, targetDir):
    filename = ''
    image = PixivModel.PixivImage(parent=artistPage)
    # Download avatar using custom name, refer issue #174
    if len(_config.avatarNameFormat) > 0:
        filenameFormat = _config.avatarNameFormat
        filename = makeFilename(filenameFormat,
                                image,
                                tagsSeparator=_config.tagsSeparator,
                                tagsLimit=_config.tagsLimit,
                                fileUrl=artistPage.artistAvatar,
                                appendExtension=True)
        filename = sanitizeFilename(filename, targetDir)
    else:
        # or as folder.jpg
        filenameFormat = _config.filenameFormat
        if filenameFormat.find(os.sep) == -1:
            filenameFormat = os.sep + filenameFormat
        filenameFormat = os.sep.join(filenameFormat.split(os.sep)[:-1])
        filename = makeFilename(filenameFormat,
                                image,
                                tagsSeparator=_config.tagsSeparator,
                                tagsLimit=_config.tagsLimit,
                                fileUrl=artistPage.artistAvatar,
                                appendExtension=False)
        filename = sanitizeFilename(filename + os.sep + 'folder.jpg',
                                    targetDir)
    return filename
예제 #3
0
 def parseMemberTags(self, artist, memberId, query=""):
     '''process artist result and return the image list'''
     self.itemList = list()
     self.memberId = memberId
     self.query = query
     self.haveImage = artist.haveImages
     self.isLastPage = artist.isLastPage
     for image in artist.imageList:
         self.itemList.append(PixivModel.PixivTagsItem(int(image), 0, 0))
예제 #4
0
def CreateAvatarFilename(filenameFormat, tagsSeparator, tagsLimit, artistPage, targetDir):
    filename = ''
    if filenameFormat.find(os.sep) == -1:
        filenameFormat = os.sep + filenameFormat
    filenameFormat = os.sep.join(filenameFormat.split(os.sep)[:-1])
    image = PixivModel.PixivImage(parent=artistPage)
    filename = makeFilename(filenameFormat, image, tagsSeparator=tagsSeparator, tagsLimit=tagsLimit,
                            fileUrl=artistPage.artistAvatar, appendExtension=False)
    filename = sanitizeFilename(filename + os.sep + 'folder.jpg', targetDir)
    return filename
예제 #5
0
def main(user, max_times, private, download_type, works_type, tags_include,
         tags_exclude):
    '''
    A simple CMD tool for bookmarks download and user's works download.
    Supports database updating.

    Download type: 0: Bookmarks | 1: User's works
    '''
    try:
        tags_include = None if not tags_include else set(
            tags_include.split(';'))
        tags_exclude = None if not tags_exclude else set(
            tags_exclude.split(';'))
    except:
        print('Value USER | MAX | DOWNLOAD_TYPE must be INT.')
        exit(-1)

    pcfg = PixivConfig.PixivConfig('config.json')
    papi = PixivAPI.PixivAPI(logger=pcfg.get_logger('PixivAPI'))

    if pcfg.cfg['pixiv']['refresh_token']:
        login_result = papi.login(
            refresh_token=pcfg.cfg['pixiv']['refresh_token'])
    else:
        import getpass
        username = input('E-mail / Pixiv ID: ')
        password = getpass.getpass()
        login_result = papi.login(username, password)

    if login_result['status_code'] != 0:
        exit(-1)

    logger = pcfg.get_logger('PixivCMD')
    pdb = PixivModel.PixivDB(pcfg.database_uri)
    pdl = PixivDownloader.PixivDownloader(
        pcfg.pixiv_works_dir, logger=pcfg.get_logger('PixivDownloader'))
    if download_type == 'bookmarks':
        logger.info('Downloading all bookmarks...')
    elif download_type == 'user':
        logger.info('Downloading user\'s works...')
    if not user:
        user = papi.pixiv_user_id
    pdl.all_works(download_type, papi, pdb.sessionmaker(), user, max_times,
                  works_type, tags_include, tags_exclude)

    while True:
        if pdl.dq.unfinished_tasks:
            time.sleep(0.1)
        else:
            break

    pdl.dq.join()
    logger.info('Works download task for user %s done!' % papi.pixiv_user_id)
예제 #6
0
    def getSearchTagPage(self, tags,
                         current_page,
                         wild_card=True,
                         title_caption=False,
                         start_date=None,
                         end_date=None,
                         member_id=None,
                         oldest_first=False,
                         start_page=1):
        response = None
        result = None
        url = ''

        if member_id is not None:
            # from member id search by tags
            (artist, response) = self.getMemberPage(member_id, current_page, False, tags)

            # convert to PixivTags
            result = PixivModelWhiteCube.PixivTags()
            result.parseMemberTags(artist, member_id, tags)
        else:
            # search by tags
            url = PixivHelper.generateSearchTagUrl(tags, current_page,
                                                   title_caption,
                                                   wild_card,
                                                   oldest_first,
                                                   start_date,
                                                   end_date,
                                                   member_id,
                                                   self._config.r18mode)

            PixivHelper.print_and_log('info', 'Looping... for ' + url)
            # response = self.open(url).read()
            response = self.getPixivPage(url, returnParsed=False).read()
            self.handleDebugTagSearchPage(response, url)

            parse_search_page = BeautifulSoup(response)

            result = PixivModel.PixivTags()
            if member_id is not None:
                result.parseMemberTags(parse_search_page, member_id, tags)
            else:
                try:
                    result.parseTags(parse_search_page, tags)
                except BaseException:
                    PixivHelper.dumpHtml("Dump for SearchTags " + tags + ".html", response)
                    raise

            parse_search_page.decompose()
            del parse_search_page

        return (result, response)
    def getMemberPage(self, member_id, page=1, bookmark=False, tags=None):
        artist = None
        response = None
        if tags is not None:
            tags = PixivHelper.encode_tags(tags)

        if self._isWhitecube:
            limit = 50
            if bookmark:
                (url, response) = self.getMemberBookmarkWhiteCube(
                    member_id, page, limit, tags)
            else:
                offset = (page - 1) * limit
                url = 'https://www.pixiv.net/rpc/whitecube/index.php?mode=user_new_unified&id={0}&offset_illusts={1}&offset_novels={2}&limit={3}&tt={4}'.format(
                    member_id, offset, 0, limit, self._whitecubeToken)
                if tags is not None:
                    url = url + '&tag={0}'.format(tags)
                elif self._config.r18mode:
                    url = url + '&tag=R-18'
                PixivHelper.print_and_log('info', 'Member Url: ' + url)

            if url is not None:
                response = self.open(url).read()
                PixivHelper.GetLogger().debug(response)
                artist = PixivModelWhiteCube.PixivArtist(
                    member_id, response, False)
                self.getMemberInfoWhitecube(member_id, artist, bookmark)

        else:
            if bookmark:
                member_url = 'https://www.pixiv.net/bookmark.php?id=' + str(
                    member_id) + '&p=' + str(page)
            else:
                member_url = 'https://www.pixiv.net/member_illust.php?id=' + str(
                    member_id) + '&p=' + str(page)

            if tags is not None:
                member_url = member_url + "&tag=" + tags
            elif self._config.r18mode and not bookmark:
                member_url = member_url + '&tag=R-18'
                PixivHelper.print_and_log('info', 'R-18 Mode only.')
            PixivHelper.print_and_log('info', 'Member Url: ' + member_url)
            response = self.getPixivPage(member_url)
            artist = PixivModel.PixivArtist(mid=member_id, page=response)

        return (artist, response)
예제 #8
0
    def Artist2Tasks(self, artist, path=''):
        #format: artist/type/
        types = ['illust', 'manga']  #,'ugoira']
        works_dir = path + str(artist.uid) + '_' + artist.content['name'] + '/'
        if not os.path.exists(works_dir):
            os.mkdir(works_dir)

        for ctype in types:
            if ctype in artist.content:
                cdir = works_dir + str(ctype) + '/'
                if not os.path.exists(cdir):
                    os.mkdir(cdir)

                for wid in artist.content[ctype]:
                    work = PixivModel.Work(id=wid)
                    work.crawlData()
                    self.Work2Tasks(work=work, path=cdir)
예제 #9
0
    def parseTags(self, page, query=""):
        payload = json.loads(page)
        self.query = query

        # check error
        if payload["error"]:
            raise PixivException('Image Error: ' + payload["message"],
                                 errorCode=PixivException.SERVER_ERROR)

        # parse image information
        parsed = BeautifulSoup(payload["body"]["html"])
        self.itemList = list()
        images = parsed.findAll("div",
                                attrs={"class": self.__re_imageItemClass})
        for item in images:
            thumbnail_container = item.find(
                "div", attrs={"class": "thumbnail-container"})
            image_details = thumbnail_container.find(
                "a", attrs={"class": "_work-modal-target user-activity"})
            image_id = image_details["data-work-id"]

            # like count
            status_container = thumbnail_container.find(
                "div", attrs={"class": "status-container"})
            bookmarkCount = status_container.text

            imageResponse = 0
            self.itemList.append(
                PixivModel.PixivTagsItem(int(image_id), int(bookmarkCount),
                                         int(imageResponse)))

        if len(self.itemList) > 0:
            self.haveImage = True
        else:
            self.haveImage = False

        # search page info
        self.availableImages = int(payload["body"]["total"])
        if len(payload["body"]["next_url"]) > 0:
            self.isLastPage = False
        else:
            self.isLastPage = True

        return self.itemList
예제 #10
0
    def parseTags(self, page, query="", curr_page=1):
        payload = json.loads(page)
        self.query = query

        # check error
        if payload["error"]:
            raise PixivException('Image Error: ' + payload["message"],
                                 errorCode=PixivException.SERVER_ERROR)

        # parse images information
        self.itemList = list()
        for item in payload["body"]["illustManga"]["data"]:
            if item["isAdContainer"]:
                continue

            image_id = item["id"]
            # like count not available anymore, need to call separate request...
            bookmarkCount = 0
            imageResponse = 0
            tag_item = PixivModel.PixivTagsItem(int(image_id),
                                                int(bookmarkCount),
                                                int(imageResponse))
            self.itemList.append(tag_item)

        self.haveImage = False
        if len(self.itemList) > 0:
            self.haveImage = True

        # search page info
        self.availableImages = int(payload["body"]["illustManga"]["total"])
        # assuming there are only 47 image (1 is marked as ad)
        if self.availableImages > 47 * curr_page:
            self.isLastPage = False
        else:
            self.isLastPage = True

        return self.itemList
예제 #11
0
    def getMemberPage(self, member_id, page=1, bookmark=False, tags=None, user_dir=''):
        artist = None
        response = None

        if self._isWhitecube:
            limit = 50
            if bookmark:
                PixivHelper.printAndLog('info', 'Getting Bookmark Url for page {0}...'.format(page))
                # iterate to get next page url
                start = 1
                last_member_bookmark_next_url = None
                while start <= page:
                    if start == 1:
                        url = 'https://www.pixiv.net/rpc/whitecube/index.php?mode=user_collection_unified&id={0}&bookmark_restrict={1}&limit={2}&is_profile_page={3}&is_first_request={4}&max_illust_bookmark_id={5}&max_novel_bookmark_id={6}&tt={7}'
                        url = url.format(member_id, 0, limit, 1, 1, 0, 0, self._whitecubeToken)
                    else:
                        url = last_member_bookmark_next_url

                    # PixivHelper.printAndLog('info', 'Member Bookmark Page {0} Url: {1}'.format(start, url))
                    if self._cache.has_key(url):
                        response = self._cache[url]
                    else:
                        response = self.open(url).read()
                        self._cache[url] = response

                    payload = json.loads(response)
                    last_member_bookmark_next_url = payload["body"]["next_url"]
                    if last_member_bookmark_next_url is None and start  < page:
                        PixivHelper.printAndLog('info', 'No more images for {0} bookmarks'.format(member_id))
                        url = None
                        break

                    start = start + 1
                PixivHelper.printAndLog('info', 'Member Bookmark Page {0} Url: {1}'.format(page, url))
            else:
                offset = (page - 1) * limit
                url = 'https://www.pixiv.net/rpc/whitecube/index.php?mode=user_new_unified&id={0}&offset_illusts={1}&offset_novels={2}&limit={3}&tt={4}'.format(member_id, offset, 0, limit, self._whitecubeToken)
                PixivHelper.printAndLog('info', 'Member Url: ' + url)

            if url is not None:
                response = self.open(url).read()
                PixivHelper.GetLogger().debug(response);
                artist = PixivModelWhiteCube.PixivArtist(member_id, response, False)
                self.getMemberInfoWhitecube(member_id, artist, bookmark)

        else:
            if bookmark:
                member_url = 'http://www.pixiv.net/bookmark.php?id=' + str(member_id) + '&p=' + str(page)
                if tags is not None:
                    tags = encode_tags(tags)
                    member_url = member_url + "&tag=" + tags
            else:
                member_url = 'http://www.pixiv.net/member_illust.php?id=' + str(member_id) + '&p=' + str(page)
            if self._config.r18mode and not bookmark:
                member_url = member_url + '&tag=R-18'
                PixivHelper.printAndLog('info', 'R-18 Mode only.')
            PixivHelper.printAndLog('info', 'Member Url: ' + member_url)
            response = self.getPixivPage(member_url)
            artist = PixivModel.PixivArtist(mid=member_id, page=response)

        return (artist, response)
예제 #12
0
    def getMemberPage(self, member_id, page=1, bookmark=False, tags=None):
        artist = None
        response = None
        if tags is not None:
            tags = PixivHelper.encode_tags(tags)
        else:
            tags = ''

        if True:
            limit = 24
            need_to_slice = False
            if bookmark:
                # (url, response) = self.getMemberBookmarkWhiteCube(member_id, page, limit, tags)
                # https://www.pixiv.net/ajax/user/1039353/illusts/bookmarks?tag=&offset=0&limit=24&rest=show
                url = 'https://www.pixiv.net/ajax/user/{0}/illusts/bookmarks?tag={1}&offset={2}&limit={3}'.format(
                    member_id, tags, offset, limit)
            else:
                # https://www.pixiv.net/ajax/user/1813972/illusts/tag/Fate%2FGrandOrder?offset=0&limit=24
                # https://www.pixiv.net/ajax/user/1813972/manga/tag/%E3%83%A1%E3%82%A4%E3%82%AD%E3%83%B3%E3%82%B0?offset=0&limit=24
                # https://www.pixiv.net/ajax/user/1113943/illustmanga/tag/%E6%A5%B5%E4%B8%8A%E3%81%AE%E4%B9%B3?offset=0&limit=24
                # https://www.pixiv.net/ajax/user/1813972/profile/all
                offset = (page - 1) * limit
                url = None
                if len(tags) > 0:
                    url = 'https://www.pixiv.net/ajax/user/{0}/illustmanga/tag/{1}?offset={2}&limit={3}'.format(
                        member_id, tags, offset, limit)
                elif self._config.r18mode:
                    url = 'https://www.pixiv.net/ajax/user/{0}/illustmanga/tag/{1}?offset={2}&limit={3}'.format(
                        member_id, 'R-18', offset, limit)
                else:
                    url = 'https://www.pixiv.net/ajax/user/{0}/profile/all'.format(
                        member_id)
                    need_to_slice = True

                PixivHelper.print_and_log('info', 'Member Url: ' + url)

            if url is not None:
                # cache the response
                response = self.get_from_cache(url)
                if response is None:
                    response = self.open(url).read()
                    self.put_to_cache(url, response)

                PixivHelper.GetLogger().debug(response)
                artist = PixivModelWhiteCube.PixivArtist(
                    member_id, response, False, offset, limit)
                self.getMemberInfoWhitecube(member_id, artist, bookmark)

                if artist.haveImages and need_to_slice:
                    artist.imageList = artist.imageList[offset:offset + limit]
        else:
            if bookmark:
                member_url = 'https://www.pixiv.net/bookmark.php?id=' + str(
                    member_id) + '&p=' + str(page)
            else:
                member_url = 'https://www.pixiv.net/member_illust.php?id=' + str(
                    member_id) + '&p=' + str(page)

            if len(tags) > 0:
                member_url = member_url + "&tag=" + tags
            elif self._config.r18mode and not bookmark:
                member_url = member_url + '&tag=R-18'
                PixivHelper.print_and_log('info', 'R-18 Mode only.')
            PixivHelper.print_and_log('info', 'Member Url: ' + member_url)
            response = self.getPixivPage(member_url)
            artist = PixivModel.PixivArtist(mid=member_id, page=response)

        return (artist, response)
예제 #13
0
        for ctype in types:
            if ctype in artist.content:
                cdir = works_dir + str(ctype) + '/'
                if not os.path.exists(cdir):
                    os.mkdir(cdir)

                for wid in artist.content[ctype]:
                    work = PixivModel.Work(id=wid)
                    work.crawlData()
                    self.Work2Tasks(work=work, path=cdir)

    def download(self):
        self.downloader.run()


if __name__ == '__main__':
    #os.chdir('pixiv')
    PixivModel.Login()

    pc = PixivCrawler()
    artist = PixivModel.Artist(170597)
    artist.crawlData()
    pc.Artist2Tasks(artist, 'pixiv/')
    pc.download()
    #work = PixivModel.Work(69001507)
    #work.crawlData()
    #pc.Work2Tasks(work, 'As109/illust/')
    #while not pc.Q.empty():

    #print(pc.Q.get())
예제 #14
0
    def getSearchTagPage(self,
                         tags,
                         i,
                         wild_card=True,
                         title_caption=False,
                         start_date=None,
                         end_date=None,
                         member_id=None,
                         oldest_first=False,
                         start_page=1):
        response = None
        result = None

        if self._isWhitecube:
            if member_id is None:
                # from search page:
                # https://www.pixiv.net/rpc/whitecube/index.php?order=date&adult_mode=include&q=vocaloid&p=0&type=&mode=whitecube_search&s_mode=s_tag&scd=&size=&ratio=&like=&tools=&tt=4e2cdee233f1156231ee99da1e51a83c
                url = "https://www.pixiv.net/rpc/whitecube/index.php?q={0}".format(
                    tags)
                url = url + "&adult_mode={0}".format("include")
                url = url + "&mode={0}".format("whitecube_search")

                # date ordering
                order = "date_d"
                if oldest_first:
                    order = "date"
                url = url + "&order={0}".format(order)

                # search mode
                s_mode = "s_tag_full"
                if wild_card:
                    s_mode = "s_tag"
                elif title_caption:
                    s_mode = "s_tc"
                url = url + "&s_mode={0}".format(s_mode)

                # start/end date
                if start_date is not None:
                    url = url + "&scd={0}".format(start_date)
                if end_date is not None:
                    url = url + "&ecd={0}".format(end_date)

                url = url + "&p={0}".format(i)
                url = url + "&start_page={0}".format(start_page)
                url = url + "&tt={0}".format(self._whitecubeToken)

                PixivHelper.printAndLog('info',
                                        'Looping for {0} ...'.format(url))
                response = self.open(url).read()
                PixivHelper.GetLogger().debug(response)
                result = PixivModelWhiteCube.PixivTags()
                result.parseTags(response, tags)
            else:
                # from member id search by tags
                print "Not supported yet"
        else:
            url = PixivHelper.generateSearchTagUrl(tags, i, title_caption,
                                                   wild_card, oldest_first,
                                                   start_date, end_date,
                                                   member_id,
                                                   self._config.r18mode)

            PixivHelper.printAndLog('info', 'Looping... for ' + url)
            response = self.open(url).read()
            parse_search_page = BeautifulSoup(response)

            if self._config.dumpTagSearchPage and self._config.enableDump:
                dump_filename = PixivHelper.dumpHtml(url + ".html",
                                                     parse_search_page)
                PixivHelper.printAndLog(
                    'info', "Dump tag search page to: " + dump_filename)

            result = PixivModel.PixivTags()
            if not member_id is None:
                result.parseMemberTags(parse_search_page, member_id, tags)
            else:
                try:
                    result.parseTags(parse_search_page, tags)
                except:
                    PixivHelper.dumpHtml(
                        "Dump for SearchTags " + tags + ".html",
                        search_page.get_data())
                    raise

            parse_search_page.decompose()
            del parse_search_page

        return (result, response)
예제 #15
0
    def getSearchTagPage(self,
                         tags,
                         current_page,
                         wild_card=True,
                         title_caption=False,
                         start_date=None,
                         end_date=None,
                         member_id=None,
                         oldest_first=False,
                         start_page=1,
                         include_bookmark_data=False):
        response = None
        result = None
        url = ''

        if member_id is not None:
            # from member id search by tags
            (artist, response) = self.getMemberPage(member_id, current_page,
                                                    False, tags)

            # convert to PixivTags
            result = PixivModelWhiteCube.PixivTags()
            result.parseMemberTags(artist, member_id, tags)
        else:
            # search by tags
            url = PixivHelper.generateSearchTagUrl(tags, current_page,
                                                   title_caption, wild_card,
                                                   oldest_first, start_date,
                                                   end_date, member_id,
                                                   self._config.r18mode)

            PixivHelper.print_and_log('info', 'Looping... for ' + url)
            response = self.getPixivPage(url, returnParsed=False)
            self.handleDebugTagSearchPage(response, url)

            result = None
            if member_id is not None:
                result = PixivModel.PixivTags()
                parse_search_page = BeautifulSoup(response)
                result.parseMemberTags(parse_search_page, member_id, tags)
                parse_search_page.decompose()
                del parse_search_page
            else:
                try:
                    result = PixivModelWhiteCube.PixivTags()
                    result.parseTags(response, tags, current_page)

                    # parse additional information
                    if include_bookmark_data:
                        idx = 0
                        print("Retrieving bookmark information...", end=' ')
                        for image in result.itemList:
                            idx = idx + 1
                            print("\r", end=' ')
                            print(
                                "Retrieving bookmark information... [{0}] of [{1}]"
                                .format(idx, len(result.itemList)),
                                end=' ')

                            img_url = "https://www.pixiv.net/ajax/illust/{0}".format(
                                image.imageId)
                            response = self._get_from_cache(img_url)
                            if response is None:
                                try:
                                    response = self.open_with_retry(
                                        img_url).read()
                                except urllib2.HTTPError as ex:
                                    if ex.code == 404:
                                        response = ex.read()
                                self._put_to_cache(img_url, response)

                            image_info_js = json.loads(response)
                            image.bookmarkCount = int(
                                image_info_js["body"]["bookmarkCount"])
                            image.imageResponse = int(
                                image_info_js["body"]["responseCount"])
                    print("")
                except BaseException:
                    PixivHelper.dumpHtml(
                        "Dump for SearchTags " + tags + ".html", response)
                    raise

        return (result, response)
예제 #16
0
    def getImagePage(self,
                     image_id,
                     parent=None,
                     from_bookmark=False,
                     bookmark_count=-1,
                     image_response_count=-1):
        image = None
        response = None
        PixivHelper.GetLogger().debug("Getting image page: %s", image_id)
        if self._isWhitecube:
            pass
##            url = "https://www.pixiv.net/rpc/whitecube/index.php?mode=work_details_modal_whitecube&id={0}&tt={1}".format(image_id, self._whitecubeToken)
##            response = self.open(url).read()
##            self.handleDebugMediumPage(response, image_id)
##            # PixivHelper.GetLogger().debug(response)
##
##            image = PixivModelWhiteCube.PixivImage(image_id,
##                                                   response,
##                                                   parent,
##                                                   from_bookmark,
##                                                   bookmark_count,
##                                                   image_response_count,
##                                                   dateFormat=self._config.dateFormat)
##            # overwrite artist info
##            if from_bookmark:
##                self.getMemberInfoWhitecube(image.originalArtist.artistId, image.originalArtist)
##            else:
##                self.getMemberInfoWhitecube(image.artist.artistId, image.artist)

        else:
            url = "https://www.pixiv.net/member_illust.php?mode=medium&illust_id={0}".format(
                image_id)
            # response = self.open(url).read()
            response = self.getPixivPage(url, returnParsed=False).read()
            self.handleDebugMediumPage(response, image_id)

            # Issue #355 new ui handler
            image = None
            try:
                if response.find("globalInitData") > 0:
                    PixivHelper.print_and_log('debug', 'New UI Mode')

                    # Issue #420
                    _tzInfo = None
                    if self._config.useLocalTimezone:
                        _tzInfo = PixivHelper.LocalUTCOffsetTimezone()

                    image = PixivModelWhiteCube.PixivImage(
                        image_id,
                        response,
                        parent,
                        from_bookmark,
                        bookmark_count,
                        image_response_count,
                        dateFormat=self._config.dateFormat,
                        tzInfo=_tzInfo)

                    if image.imageMode == "ugoira_view":
                        ugoira_meta_url = "https://www.pixiv.net/ajax/illust/{0}/ugoira_meta".format(
                            image_id)
                        meta_response = self.open(ugoira_meta_url).read()
                        image.ParseUgoira(meta_response)

    ##                    PixivHelper.GetLogger().debug("animation.js")
    ##                    PixivHelper.GetLogger().debug(image.ugoira_data)

                    if parent is None:
                        if from_bookmark:
                            self.getMemberInfoWhitecube(
                                image.originalArtist.artistId,
                                image.originalArtist)
                        else:
                            self.getMemberInfoWhitecube(
                                image.artist.artistId, image.artist)

                else:
                    parsed = BeautifulSoup(response)
                    image = PixivModel.PixivImage(
                        image_id,
                        parsed,
                        parent,
                        from_bookmark,
                        bookmark_count,
                        image_response_count,
                        dateFormat=self._config.dateFormat)
                    if image.imageMode == "ugoira_view" or image.imageMode == "bigNew":
                        image.ParseImages(parsed)
                    parsed.decompose()
            except:
                PixivHelper.GetLogger().error("Respose data: \r\n %s",
                                              response)
                raise

        return (image, response)
예제 #17
0
    def getSearchTagPage(self,
                         tags,
                         current_page,
                         wild_card=True,
                         title_caption=False,
                         start_date=None,
                         end_date=None,
                         member_id=None,
                         oldest_first=False,
                         start_page=1):
        response = None
        result = None
        url = ''

        if member_id is not None:
            ##            if member_id is None:
            ##                # from search page:
            ##                # https://www.pixiv.net/rpc/whitecube/index.php?order=date&adult_mode=include&q=vocaloid&p=0&type=&mode=whitecube_search&s_mode=s_tag&scd=&size=&ratio=&like=&tools=&tt=4e2cdee233f1156231ee99da1e51a83c
            ##                url = "https://www.pixiv.net/rpc/whitecube/index.php?q={0}".format(tags)
            ##                url = url + "&adult_mode={0}".format("include")
            ##                url = url + "&mode={0}".format("whitecube_search")
            ##
            ##                # date ordering
            ##                order = "date_d"
            ##                if oldest_first:
            ##                    order = "date"
            ##                url = url + "&order={0}".format(order)
            ##
            ##                # search mode
            ##                s_mode = "s_tag_full"
            ##                if wild_card:
            ##                    s_mode = "s_tag"
            ##                elif title_caption:
            ##                    s_mode = "s_tc"
            ##                url = url + "&s_mode={0}".format(s_mode)
            ##
            ##                # start/end date
            ##                if start_date is not None:
            ##                    url = url + "&scd={0}".format(start_date)
            ##                if end_date is not None:
            ##                    url = url + "&ecd={0}".format(end_date)
            ##
            ##                url = url + "&p={0}".format(i)
            ##                url = url + "&start_page={0}".format(start_page)
            ##                url = url + "&tt={0}".format(self._whitecubeToken)
            ##
            ##                PixivHelper.print_and_log('info', 'Looping for {0} ...'.format(url))
            ##                response = self.open(url).read()
            ##                self.handleDebugTagSearchPage(response, url)
            ##
            ##                PixivHelper.GetLogger().debug(response)
            ##                result = PixivModelWhiteCube.PixivTags()
            ##                result.parseTags(response, tags)
            ##            else:
            # from member id search by tags
            (artist, response) = self.getMemberPage(member_id, current_page,
                                                    False, tags)

            # convert to PixivTags
            result = PixivModelWhiteCube.PixivTags()
            result.parseMemberTags(artist, member_id, tags)
        else:
            # search by tags
            url = PixivHelper.generateSearchTagUrl(tags, current_page,
                                                   title_caption, wild_card,
                                                   oldest_first, start_date,
                                                   end_date, member_id,
                                                   self._config.r18mode)

            PixivHelper.print_and_log('info', 'Looping... for ' + url)
            # response = self.open(url).read()
            response = self.getPixivPage(url, returnParsed=False).read()
            self.handleDebugTagSearchPage(response, url)

            parse_search_page = BeautifulSoup(response)

            result = PixivModel.PixivTags()
            if member_id is not None:
                result.parseMemberTags(parse_search_page, member_id, tags)
            else:
                try:
                    result.parseTags(parse_search_page, tags)
                except BaseException:
                    PixivHelper.dumpHtml(
                        "Dump for SearchTags " + tags + ".html", response)
                    raise

            parse_search_page.decompose()
            del parse_search_page

        return (result, response)
예제 #18
0
from pathlib import Path

from flask import Flask, request, send_from_directory
from flask_restful import Api, Resource

import PixivConfig
import PixivModel as PM

PixivConfig.cd_script_dir()
pcfg = PixivConfig.PixivConfig('config.json')

app = Flask('PixivWebAPI')
api = Api(app)
db = PM.PixivDB(pcfg.database_uri)


class GetWorksCaption(Resource):
    def get(self, works_id: int):
        session = db.sessionmaker()
        r = session.query(PM.WorksCaption).filter(
            PM.WorksCaption.works_id == works_id).one_or_none()
        if r:
            return r.caption_text


api.add_resource(GetWorksCaption, '/api/getCaption/<int:works_id>')


@app.route('/image/<path:path>')
def send_stored_img(path):
    return send_from_directory('./Test/stable/storage/works', path)